@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.
- package/CHANGELOG.md +17 -0
- package/CLAUDE.md +87 -8
- package/bin/ynab-mcp-server.cjs +2 -2
- package/bin/ynab-mcp-server.js +3 -3
- package/biome.json +39 -0
- package/dist/bundle/index.cjs +67 -67
- package/dist/index.d.ts +1 -1
- package/dist/index.js +27 -27
- package/dist/server/YNABMCPServer.d.ts +3 -4
- package/dist/server/YNABMCPServer.js +111 -116
- package/dist/server/budgetResolver.d.ts +6 -5
- package/dist/server/budgetResolver.js +46 -36
- package/dist/server/cacheKeys.js +6 -6
- package/dist/server/cacheManager.js +14 -11
- package/dist/server/completions.d.ts +2 -2
- package/dist/server/completions.js +20 -15
- package/dist/server/config.d.ts +10 -5
- package/dist/server/config.js +24 -7
- package/dist/server/deltaCache.d.ts +2 -2
- package/dist/server/deltaCache.js +22 -16
- package/dist/server/deltaCache.merge.d.ts +2 -2
- package/dist/server/diagnostics.d.ts +4 -4
- package/dist/server/diagnostics.js +38 -32
- package/dist/server/errorHandler.d.ts +5 -12
- package/dist/server/errorHandler.js +219 -217
- package/dist/server/prompts.d.ts +2 -2
- package/dist/server/prompts.js +45 -45
- package/dist/server/rateLimiter.js +4 -4
- package/dist/server/requestLogger.d.ts +1 -1
- package/dist/server/requestLogger.js +40 -35
- package/dist/server/resources.d.ts +3 -3
- package/dist/server/resources.js +55 -52
- package/dist/server/responseFormatter.js +6 -6
- package/dist/server/securityMiddleware.d.ts +2 -2
- package/dist/server/securityMiddleware.js +22 -20
- package/dist/server/serverKnowledgeStore.js +1 -1
- package/dist/server/toolRegistry.d.ts +3 -3
- package/dist/server/toolRegistry.js +47 -40
- package/dist/tools/__tests__/deltaTestUtils.d.ts +3 -3
- package/dist/tools/__tests__/deltaTestUtils.js +2 -2
- package/dist/tools/accountTools.d.ts +9 -8
- package/dist/tools/accountTools.js +47 -47
- package/dist/tools/adapters.d.ts +13 -8
- package/dist/tools/adapters.js +21 -11
- package/dist/tools/budgetTools.d.ts +8 -7
- package/dist/tools/budgetTools.js +22 -22
- package/dist/tools/categoryTools.d.ts +9 -8
- package/dist/tools/categoryTools.js +68 -59
- package/dist/tools/compareTransactions/formatter.d.ts +3 -3
- package/dist/tools/compareTransactions/formatter.js +9 -9
- package/dist/tools/compareTransactions/index.d.ts +6 -6
- package/dist/tools/compareTransactions/index.js +58 -43
- package/dist/tools/compareTransactions/matcher.d.ts +1 -1
- package/dist/tools/compareTransactions/matcher.js +28 -15
- package/dist/tools/compareTransactions/parser.d.ts +2 -2
- package/dist/tools/compareTransactions/parser.js +144 -138
- package/dist/tools/compareTransactions/types.d.ts +4 -4
- package/dist/tools/compareTransactions.d.ts +1 -1
- package/dist/tools/compareTransactions.js +1 -1
- package/dist/tools/deltaFetcher.d.ts +2 -2
- package/dist/tools/deltaFetcher.js +16 -15
- package/dist/tools/deltaSupport.d.ts +4 -4
- package/dist/tools/deltaSupport.js +35 -41
- package/dist/tools/exportTransactions.d.ts +5 -4
- package/dist/tools/exportTransactions.js +61 -59
- package/dist/tools/monthTools.d.ts +7 -6
- package/dist/tools/monthTools.js +31 -29
- package/dist/tools/payeeTools.d.ts +7 -6
- package/dist/tools/payeeTools.js +28 -28
- package/dist/tools/reconcileAdapter.d.ts +2 -2
- package/dist/tools/reconcileAdapter.js +21 -11
- package/dist/tools/reconciliation/analyzer.d.ts +4 -4
- package/dist/tools/reconciliation/analyzer.js +136 -57
- package/dist/tools/reconciliation/csvParser.d.ts +3 -3
- package/dist/tools/reconciliation/csvParser.js +128 -104
- package/dist/tools/reconciliation/executor.d.ts +4 -4
- package/dist/tools/reconciliation/executor.js +148 -109
- package/dist/tools/reconciliation/index.d.ts +10 -10
- package/dist/tools/reconciliation/index.js +96 -83
- package/dist/tools/reconciliation/matcher.d.ts +3 -3
- package/dist/tools/reconciliation/matcher.js +17 -16
- package/dist/tools/reconciliation/payeeNormalizer.js +19 -8
- package/dist/tools/reconciliation/recommendationEngine.d.ts +1 -1
- package/dist/tools/reconciliation/recommendationEngine.js +40 -40
- package/dist/tools/reconciliation/reportFormatter.d.ts +2 -2
- package/dist/tools/reconciliation/reportFormatter.js +79 -54
- package/dist/tools/reconciliation/signDetector.d.ts +1 -1
- package/dist/tools/reconciliation/types.d.ts +19 -16
- package/dist/tools/reconciliation/ynabAdapter.d.ts +2 -2
- package/dist/tools/schemas/common.d.ts +1 -1
- package/dist/tools/schemas/common.js +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/accountOutputs.js +24 -18
- package/dist/tools/schemas/outputs/budgetOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/budgetOutputs.js +14 -11
- package/dist/tools/schemas/outputs/categoryOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/categoryOutputs.js +49 -29
- package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/comparisonOutputs.js +12 -12
- package/dist/tools/schemas/outputs/index.d.ts +14 -14
- package/dist/tools/schemas/outputs/index.js +14 -14
- package/dist/tools/schemas/outputs/monthOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/monthOutputs.js +56 -41
- package/dist/tools/schemas/outputs/payeeOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/payeeOutputs.js +10 -10
- package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +2 -2
- package/dist/tools/schemas/outputs/reconciliationOutputs.js +45 -45
- package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionMutationOutputs.js +28 -22
- package/dist/tools/schemas/outputs/transactionOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/transactionOutputs.js +43 -35
- package/dist/tools/schemas/outputs/utilityOutputs.d.ts +1 -1
- package/dist/tools/schemas/outputs/utilityOutputs.js +5 -3
- package/dist/tools/schemas/shared/commonOutputs.d.ts +1 -1
- package/dist/tools/schemas/shared/commonOutputs.js +15 -9
- package/dist/tools/transactionReadTools.d.ts +11 -0
- package/dist/tools/transactionReadTools.js +202 -0
- package/dist/tools/transactionSchemas.d.ts +309 -0
- package/dist/tools/transactionSchemas.js +235 -0
- package/dist/tools/transactionTools.d.ts +6 -302
- package/dist/tools/transactionTools.js +7 -2054
- package/dist/tools/transactionUtils.d.ts +31 -0
- package/dist/tools/transactionUtils.js +364 -0
- package/dist/tools/transactionWriteTools.d.ts +20 -0
- package/dist/tools/transactionWriteTools.js +1342 -0
- package/dist/tools/utilityTools.d.ts +5 -4
- package/dist/tools/utilityTools.js +11 -11
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +6 -6
- package/dist/types/reconciliation.d.ts +1 -1
- package/dist/types/toolRegistration.d.ts +14 -12
- package/dist/utils/amountUtils.js +1 -1
- package/dist/utils/dateUtils.js +4 -4
- package/dist/utils/errors.d.ts +3 -3
- package/dist/utils/errors.js +4 -4
- package/dist/utils/money.d.ts +2 -2
- package/dist/utils/money.js +8 -8
- package/dist/utils/validationError.d.ts +1 -1
- package/dist/utils/validationError.js +1 -1
- package/docs/assets/examples/reconciliation-with-recommendations.json +66 -66
- package/docs/assets/schemas/reconciliation-v2.json +360 -336
- package/docs/plans/2025-12-25-transaction-tools-refactor-design.md +211 -0
- package/docs/plans/2025-12-25-transaction-tools-refactor.md +905 -0
- package/esbuild.config.mjs +53 -50
- package/meta.json +12548 -12548
- package/package.json +98 -109
- package/scripts/analyze-bundle.mjs +33 -30
- package/scripts/create-pr-description.js +169 -120
- package/scripts/run-all-tests.js +205 -0
- package/scripts/run-domain-integration-tests.js +28 -18
- package/scripts/run-generate-mcpb.js +19 -17
- package/scripts/run-throttled-integration-tests.js +92 -83
- package/scripts/test-delta-params.mjs +149 -120
- package/scripts/test-recommendations.ts +36 -32
- package/scripts/tmpTransaction.ts +80 -43
- package/scripts/validate-env.js +98 -91
- package/scripts/verify-build.js +78 -76
- package/src/__tests__/comprehensive.integration.test.ts +1281 -1154
- package/src/__tests__/performance.test.ts +723 -671
- package/src/__tests__/setup.ts +442 -395
- package/src/__tests__/smoke.e2e.test.ts +41 -39
- package/src/__tests__/testRunner.ts +314 -295
- package/src/__tests__/testUtils.ts +456 -364
- package/src/__tests__/tools/reconciliation/csvParser.integration.test.ts +109 -107
- package/src/__tests__/tools/reconciliation/real-world.integration.test.ts +41 -41
- package/src/index.ts +68 -59
- package/src/server/CLAUDE.md +480 -0
- package/src/server/YNABMCPServer.ts +821 -794
- package/src/server/__tests__/YNABMCPServer.integration.test.ts +929 -893
- package/src/server/__tests__/YNABMCPServer.test.ts +903 -899
- package/src/server/__tests__/budgetResolver.test.ts +466 -423
- package/src/server/__tests__/cacheManager.test.ts +891 -874
- package/src/server/__tests__/completions.integration.test.ts +115 -106
- package/src/server/__tests__/completions.test.ts +334 -313
- package/src/server/__tests__/config.test.ts +98 -86
- package/src/server/__tests__/deltaCache.merge.test.ts +774 -703
- package/src/server/__tests__/deltaCache.swr.test.ts +198 -153
- package/src/server/__tests__/deltaCache.test.ts +946 -759
- package/src/server/__tests__/diagnostics.test.ts +825 -792
- package/src/server/__tests__/errorHandler.integration.test.ts +512 -462
- package/src/server/__tests__/errorHandler.test.ts +402 -397
- package/src/server/__tests__/prompts.test.ts +424 -347
- package/src/server/__tests__/rateLimiter.test.ts +313 -309
- package/src/server/__tests__/requestLogger.test.ts +443 -403
- package/src/server/__tests__/resources.template.test.ts +196 -185
- package/src/server/__tests__/resources.test.ts +294 -288
- package/src/server/__tests__/security.integration.test.ts +487 -421
- package/src/server/__tests__/securityMiddleware.test.ts +519 -444
- package/src/server/__tests__/server-startup.integration.test.ts +509 -490
- package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -173
- package/src/server/__tests__/toolRegistration.test.ts +239 -210
- package/src/server/__tests__/toolRegistry.test.ts +907 -845
- package/src/server/budgetResolver.ts +221 -181
- package/src/server/cacheKeys.ts +6 -6
- package/src/server/cacheManager.ts +498 -484
- package/src/server/completions.ts +267 -243
- package/src/server/config.ts +35 -14
- package/src/server/deltaCache.merge.ts +146 -128
- package/src/server/deltaCache.ts +352 -309
- package/src/server/diagnostics.ts +257 -242
- package/src/server/errorHandler.ts +747 -744
- package/src/server/prompts.ts +181 -176
- package/src/server/rateLimiter.ts +131 -129
- package/src/server/requestLogger.ts +350 -322
- package/src/server/resources.ts +442 -374
- package/src/server/responseFormatter.ts +41 -37
- package/src/server/securityMiddleware.ts +223 -205
- package/src/server/serverKnowledgeStore.ts +67 -67
- package/src/server/toolRegistry.ts +508 -474
- package/src/tools/CLAUDE.md +604 -0
- package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -111
- package/src/tools/__tests__/accountTools.integration.test.ts +129 -111
- package/src/tools/__tests__/accountTools.test.ts +685 -638
- package/src/tools/__tests__/adapters.test.ts +142 -108
- package/src/tools/__tests__/budgetTools.delta.integration.test.ts +73 -73
- package/src/tools/__tests__/budgetTools.integration.test.ts +132 -124
- package/src/tools/__tests__/budgetTools.test.ts +442 -413
- package/src/tools/__tests__/categoryTools.delta.integration.test.ts +76 -68
- package/src/tools/__tests__/categoryTools.integration.test.ts +314 -288
- package/src/tools/__tests__/categoryTools.test.ts +656 -625
- package/src/tools/__tests__/compareTransactions/formatter.test.ts +535 -462
- package/src/tools/__tests__/compareTransactions/index.test.ts +378 -358
- package/src/tools/__tests__/compareTransactions/matcher.test.ts +497 -398
- package/src/tools/__tests__/compareTransactions/parser.test.ts +765 -747
- package/src/tools/__tests__/compareTransactions.test.ts +352 -332
- package/src/tools/__tests__/compareTransactions.window.test.ts +150 -146
- package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +69 -65
- package/src/tools/__tests__/deltaFetcher.test.ts +325 -265
- package/src/tools/__tests__/deltaSupport.test.ts +211 -184
- package/src/tools/__tests__/deltaTestUtils.ts +37 -33
- package/src/tools/__tests__/exportTransactions.test.ts +205 -200
- package/src/tools/__tests__/monthTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/monthTools.integration.test.ts +178 -166
- package/src/tools/__tests__/monthTools.test.ts +561 -512
- package/src/tools/__tests__/payeeTools.delta.integration.test.ts +68 -68
- package/src/tools/__tests__/payeeTools.integration.test.ts +158 -142
- package/src/tools/__tests__/payeeTools.test.ts +486 -434
- package/src/tools/__tests__/transactionSchemas.test.ts +1204 -0
- package/src/tools/__tests__/transactionTools.integration.test.ts +875 -825
- package/src/tools/__tests__/transactionTools.test.ts +4923 -4366
- package/src/tools/__tests__/transactionUtils.test.ts +1016 -0
- package/src/tools/__tests__/utilityTools.integration.test.ts +32 -32
- package/src/tools/__tests__/utilityTools.test.ts +68 -58
- package/src/tools/accountTools.ts +293 -271
- package/src/tools/adapters.ts +120 -63
- package/src/tools/budgetTools.ts +121 -116
- package/src/tools/categoryTools.ts +379 -339
- package/src/tools/compareTransactions/formatter.ts +131 -119
- package/src/tools/compareTransactions/index.ts +249 -214
- package/src/tools/compareTransactions/matcher.ts +259 -209
- package/src/tools/compareTransactions/parser.ts +517 -487
- package/src/tools/compareTransactions/types.ts +38 -38
- package/src/tools/compareTransactions.ts +1 -1
- package/src/tools/deltaFetcher.ts +281 -260
- package/src/tools/deltaSupport.ts +264 -259
- package/src/tools/exportTransactions.ts +230 -218
- package/src/tools/monthTools.ts +180 -165
- package/src/tools/payeeTools.ts +152 -140
- package/src/tools/reconcileAdapter.ts +297 -246
- package/src/tools/reconciliation/CLAUDE.md +506 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +135 -112
- package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -227
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -335
- package/src/tools/reconciliation/__tests__/csvParser.test.ts +71 -69
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +348 -323
- package/src/tools/reconciliation/__tests__/executor.progress.test.ts +503 -457
- package/src/tools/reconciliation/__tests__/executor.test.ts +898 -831
- package/src/tools/reconciliation/__tests__/matcher.test.ts +667 -663
- package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +296 -276
- package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +692 -624
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1008 -986
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -530
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -71
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -58
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +58 -43
- package/src/tools/reconciliation/__tests__/signDetector.test.ts +209 -206
- package/src/tools/reconciliation/__tests__/ynabAdapter.test.ts +66 -60
- package/src/tools/reconciliation/analyzer.ts +582 -406
- package/src/tools/reconciliation/csvParser.ts +656 -609
- package/src/tools/reconciliation/executor.ts +1290 -1128
- package/src/tools/reconciliation/index.ts +580 -528
- package/src/tools/reconciliation/matcher.ts +256 -240
- package/src/tools/reconciliation/payeeNormalizer.ts +92 -78
- package/src/tools/reconciliation/recommendationEngine.ts +357 -345
- package/src/tools/reconciliation/reportFormatter.ts +349 -276
- package/src/tools/reconciliation/signDetector.ts +89 -83
- package/src/tools/reconciliation/types.ts +164 -153
- package/src/tools/reconciliation/ynabAdapter.ts +17 -15
- package/src/tools/schemas/CLAUDE.md +546 -0
- package/src/tools/schemas/common.ts +1 -1
- package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +410 -409
- package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +305 -299
- package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +431 -430
- package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +510 -495
- package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +179 -153
- package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +293 -254
- package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +457 -457
- package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +362 -356
- package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +402 -399
- package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +225 -211
- package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +457 -454
- package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +316 -315
- package/src/tools/schemas/outputs/accountOutputs.ts +40 -34
- package/src/tools/schemas/outputs/budgetOutputs.ts +24 -19
- package/src/tools/schemas/outputs/categoryOutputs.ts +76 -56
- package/src/tools/schemas/outputs/comparisonOutputs.ts +192 -169
- package/src/tools/schemas/outputs/index.ts +163 -163
- package/src/tools/schemas/outputs/monthOutputs.ts +95 -80
- package/src/tools/schemas/outputs/payeeOutputs.ts +18 -18
- package/src/tools/schemas/outputs/reconciliationOutputs.ts +386 -373
- package/src/tools/schemas/outputs/transactionMutationOutputs.ts +259 -231
- package/src/tools/schemas/outputs/transactionOutputs.ts +81 -71
- package/src/tools/schemas/outputs/utilityOutputs.ts +90 -84
- package/src/tools/schemas/shared/commonOutputs.ts +27 -19
- package/src/tools/toolCategories.ts +114 -114
- package/src/tools/transactionReadTools.ts +327 -0
- package/src/tools/transactionSchemas.ts +484 -0
- package/src/tools/transactionTools.ts +107 -2990
- package/src/tools/transactionUtils.ts +621 -0
- package/src/tools/transactionWriteTools.ts +2110 -0
- package/src/tools/utilityTools.ts +46 -41
- package/src/types/CLAUDE.md +477 -0
- package/src/types/__tests__/index.test.ts +51 -51
- package/src/types/index.ts +43 -39
- package/src/types/integration-tests.d.ts +26 -26
- package/src/types/reconciliation.ts +29 -29
- package/src/types/toolAnnotations.ts +30 -30
- package/src/types/toolRegistration.ts +43 -32
- package/src/utils/CLAUDE.md +508 -0
- package/src/utils/__tests__/dateUtils.test.ts +174 -168
- package/src/utils/__tests__/money.test.ts +193 -187
- package/src/utils/amountUtils.ts +5 -5
- package/src/utils/baseError.ts +5 -5
- package/src/utils/dateUtils.ts +29 -26
- package/src/utils/errors.ts +14 -14
- package/src/utils/money.ts +66 -52
- package/src/utils/validationError.ts +1 -1
- package/tsconfig.json +29 -29
- package/tsconfig.prod.json +16 -16
- package/vitest-reporters/split-json-reporter.ts +247 -204
- package/vitest.config.ts +99 -95
- package/.prettierignore +0 -10
- package/.prettierrc.json +0 -10
- package/eslint.config.js +0 -49
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { cacheManager } from
|
|
2
|
-
import { DeltaCache } from
|
|
3
|
-
import { ServerKnowledgeStore } from
|
|
4
|
-
import { DeltaFetcher } from
|
|
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
|
|
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 ===
|
|
64
|
+
typeof value === "object" &&
|
|
63
65
|
value instanceof DeltaFetcher &&
|
|
64
|
-
typeof value.fetchAccounts ===
|
|
65
|
-
typeof value.fetchCategories ===
|
|
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 ===
|
|
71
|
+
typeof value === "object" &&
|
|
70
72
|
value instanceof DeltaCache &&
|
|
71
|
-
typeof value.fetchWithDelta ===
|
|
73
|
+
typeof value.fetchWithDelta === "function");
|
|
72
74
|
}
|
|
73
75
|
function isServerKnowledgeStore(value) {
|
|
74
76
|
return (value !== null &&
|
|
75
|
-
typeof value ===
|
|
77
|
+
typeof value === "object" &&
|
|
76
78
|
value instanceof ServerKnowledgeStore &&
|
|
77
|
-
typeof value.get ===
|
|
78
|
-
typeof value.update ===
|
|
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 ===
|
|
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
|
|
90
|
+
return "null";
|
|
89
91
|
if (value === undefined)
|
|
90
|
-
return
|
|
92
|
+
return "undefined";
|
|
91
93
|
const type = typeof value;
|
|
92
|
-
if (type !==
|
|
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(
|
|
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(
|
|
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(
|
|
114
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
154
|
-
|
|
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(
|
|
158
|
-
|
|
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(
|
|
163
|
-
|
|
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(
|
|
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
|
|
2
|
-
import * as ynab from
|
|
3
|
-
import { z } from
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
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,
|
|
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}$/,
|
|
15
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/, "Date must be in ISO format (YYYY-MM-DD)")
|
|
16
16
|
.optional(),
|
|
17
|
-
type: z.enum([
|
|
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(
|
|
24
|
+
return params.filename.endsWith(".json")
|
|
25
|
+
? params.filename
|
|
26
|
+
: `${params.filename}.json`;
|
|
25
27
|
}
|
|
26
|
-
const timestamp = format(new Date(),
|
|
27
|
-
let description =
|
|
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(
|
|
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
|
|
54
|
-
return join(home,
|
|
55
|
-
case
|
|
56
|
-
return join(home,
|
|
57
|
-
case
|
|
58
|
-
case
|
|
59
|
-
case
|
|
60
|
-
case
|
|
61
|
-
case
|
|
62
|
-
return process.env[
|
|
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,
|
|
66
|
+
return join(home, "Downloads");
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
function getExportPath() {
|
|
68
|
-
const exportPath = process.env[
|
|
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(
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
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),
|
|
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:
|
|
167
|
+
type: "text",
|
|
168
168
|
text: responseFormatter.format({
|
|
169
|
-
message: `Successfully exported ${transactions.length} transactions${params.minimal !== false ?
|
|
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 ?
|
|
174
|
-
minimal_fields: params.minimal !== false
|
|
175
|
-
|
|
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
|
-
},
|
|
192
|
+
}, "ynab:export_transactions", "exporting transactions", errorHandler);
|
|
191
193
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { CallToolResult } from
|
|
2
|
-
import * as ynab from
|
|
3
|
-
import { z } from
|
|
4
|
-
import type {
|
|
5
|
-
import type { ToolFactory } from
|
|
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;
|
package/dist/tools/monthTools.js
CHANGED
|
@@ -1,26 +1,28 @@
|
|
|
1
|
-
import { z } from
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { ToolAnnotationPresets } from
|
|
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,
|
|
13
|
-
month: z
|
|
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,
|
|
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,
|
|
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:
|
|
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
|
-
?
|
|
72
|
-
:
|
|
73
|
+
? "Data retrieved from cache for improved performance"
|
|
74
|
+
: "Fresh data retrieved from YNAB API",
|
|
73
75
|
}),
|
|
74
76
|
},
|
|
75
77
|
],
|
|
76
78
|
};
|
|
77
|
-
},
|
|
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:
|
|
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 ?
|
|
104
|
-
:
|
|
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
|
-
},
|
|
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:
|
|
116
|
-
description:
|
|
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:
|
|
125
|
+
title: "YNAB: Get Month Details",
|
|
124
126
|
},
|
|
125
127
|
},
|
|
126
128
|
});
|
|
127
129
|
registry.register({
|
|
128
|
-
name:
|
|
129
|
-
description:
|
|
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:
|
|
138
|
+
title: "YNAB: List Months",
|
|
137
139
|
},
|
|
138
140
|
},
|
|
139
141
|
});
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { CallToolResult } from
|
|
2
|
-
import * as ynab from
|
|
3
|
-
import { z } from
|
|
4
|
-
import type {
|
|
5
|
-
import type { ToolFactory } from
|
|
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;
|