@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.
- 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 +19 -12
- package/dist/tools/reconciliation/analyzer.d.ts +4 -4
- package/dist/tools/reconciliation/analyzer.js +73 -59
- 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 +59 -58
- package/dist/tools/reconciliation/signDetector.d.ts +1 -1
- package/dist/tools/reconciliation/types.d.ts +16 -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 +7 -7
- package/dist/tools/transactionSchemas.js +77 -57
- package/dist/tools/transactionTools.d.ts +6 -24
- package/dist/tools/transactionTools.js +7 -1499
- package/dist/tools/transactionUtils.d.ts +6 -6
- package/dist/tools/transactionUtils.js +78 -63
- 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/esbuild.config.mjs +53 -50
- package/meta.json +12548 -12548
- package/package.json +98 -111
- package/scripts/analyze-bundle.mjs +33 -30
- package/scripts/create-pr-description.js +169 -120
- package/scripts/run-all-tests.js +178 -169
- 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 +1202 -1186
- 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 +1004 -977
- 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 -252
- package/src/tools/reconciliation/CLAUDE.md +506 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +133 -124
- package/src/tools/reconciliation/__tests__/adapter.test.ts +249 -230
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +408 -400
- 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 -989
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +187 -146
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +583 -533
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +75 -74
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +70 -62
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +102 -88
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +56 -55
- 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 +564 -504
- 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 +343 -307
- package/src/tools/reconciliation/signDetector.ts +89 -83
- package/src/tools/reconciliation/types.ts +164 -159
- 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 +322 -291
- package/src/tools/transactionTools.ts +84 -2246
- package/src/tools/transactionUtils.ts +507 -422
- 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,5 +1,5 @@
|
|
|
1
|
-
import type * as ynab from
|
|
2
|
-
import type { NormalizedYNABTransaction } from
|
|
1
|
+
import type * as ynab from "ynab";
|
|
2
|
+
import type { NormalizedYNABTransaction } from "../../types/reconciliation.js";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Convert YNAB SDK transaction to normalized format for matching.
|
|
@@ -10,24 +10,26 @@ import type { NormalizedYNABTransaction } from '../../types/reconciliation.js';
|
|
|
10
10
|
* NOTE: Amount stays in milliunits - no conversion needed since
|
|
11
11
|
* YNAB API already uses milliunits natively.
|
|
12
12
|
*/
|
|
13
|
-
export function normalizeYNABTransaction(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
13
|
+
export function normalizeYNABTransaction(
|
|
14
|
+
txn: ynab.TransactionDetail,
|
|
15
|
+
): NormalizedYNABTransaction {
|
|
16
|
+
return {
|
|
17
|
+
id: txn.id,
|
|
18
|
+
date: txn.date,
|
|
19
|
+
amount: txn.amount, // Already in milliunits - no conversion!
|
|
20
|
+
payee: txn.payee_name ?? null,
|
|
21
|
+
memo: txn.memo ?? null,
|
|
22
|
+
categoryName: txn.category_name ?? null,
|
|
23
|
+
cleared: txn.cleared,
|
|
24
|
+
approved: txn.approved,
|
|
25
|
+
};
|
|
24
26
|
}
|
|
25
27
|
|
|
26
28
|
/**
|
|
27
29
|
* Batch convert YNAB transactions.
|
|
28
30
|
*/
|
|
29
31
|
export function normalizeYNABTransactions(
|
|
30
|
-
|
|
32
|
+
txns: ynab.TransactionDetail[],
|
|
31
33
|
): NormalizedYNABTransaction[] {
|
|
32
|
-
|
|
34
|
+
return txns.map(normalizeYNABTransaction);
|
|
33
35
|
}
|
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
# Schema Definitions - YNAB MCP Server
|
|
2
|
+
|
|
3
|
+
This directory contains centralized Zod schemas for input/output validation across all YNAB MCP tools.
|
|
4
|
+
|
|
5
|
+
## Purpose & Responsibilities
|
|
6
|
+
|
|
7
|
+
The `src/tools/schemas/` directory provides:
|
|
8
|
+
|
|
9
|
+
1. **Input Validation** - Type-safe validation of tool inputs
|
|
10
|
+
2. **Output Validation** - Ensure API responses match expected structure
|
|
11
|
+
3. **Shared Schemas** - Common validation patterns (emptyObject, looseObject)
|
|
12
|
+
4. **Type Generation** - Zod schemas generate TypeScript types
|
|
13
|
+
5. **Runtime Safety** - Bridge between TypeScript types and runtime values
|
|
14
|
+
|
|
15
|
+
## Directory Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/tools/schemas/
|
|
19
|
+
├── common.ts # Shared schemas (emptyObject, looseObject)
|
|
20
|
+
└── outputs/ # Output validation schemas
|
|
21
|
+
├── budgetOutput.ts # Budget response schemas
|
|
22
|
+
├── accountOutput.ts # Account response schemas
|
|
23
|
+
├── transactionOutput.ts # Transaction response schemas
|
|
24
|
+
├── categoryOutput.ts # Category response schemas
|
|
25
|
+
├── payeeOutput.ts # Payee response schemas
|
|
26
|
+
├── monthOutput.ts # Month response schemas
|
|
27
|
+
├── userOutput.ts # User response schemas
|
|
28
|
+
├── reconcileOutput.ts # Reconciliation response schemas
|
|
29
|
+
├── compareOutput.ts # Comparison response schemas
|
|
30
|
+
├── exportOutput.ts # Export response schemas
|
|
31
|
+
└── utilityOutput.ts # Utility response schemas
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Key Files & Responsibilities
|
|
35
|
+
|
|
36
|
+
| File | Responsibility | Lines | Critical |
|
|
37
|
+
|------|---------------|-------|----------|
|
|
38
|
+
| **common.ts** | Shared schemas (emptyObject, looseObject) | ~50 | HIGH |
|
|
39
|
+
| **outputs/*.ts** | Output validation schemas for each tool domain | ~100-200 each | MEDIUM |
|
|
40
|
+
|
|
41
|
+
## Critical Patterns & Conventions
|
|
42
|
+
|
|
43
|
+
### 1. Always Use `.strict()` on Input Schemas
|
|
44
|
+
|
|
45
|
+
**CRITICAL SECURITY REQUIREMENT**: All input schemas must use `.strict()` to reject unknown fields.
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
// GOOD: Strict schema (rejects unknown fields)
|
|
49
|
+
const CreateTransactionSchema = z
|
|
50
|
+
.object({
|
|
51
|
+
budget_id: z.string().optional(),
|
|
52
|
+
account_id: z.string(),
|
|
53
|
+
amount: z.number(),
|
|
54
|
+
date: z.string(),
|
|
55
|
+
})
|
|
56
|
+
.strict(); // CRITICAL!
|
|
57
|
+
|
|
58
|
+
// BAD: Non-strict schema (accepts unknown fields)
|
|
59
|
+
const CreateTransactionSchema = z.object({
|
|
60
|
+
budget_id: z.string().optional(),
|
|
61
|
+
account_id: z.string(),
|
|
62
|
+
amount: z.number(),
|
|
63
|
+
date: z.string(),
|
|
64
|
+
}); // Security vulnerability!
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Why CRITICAL**: Without `.strict()`, unknown fields are silently accepted, which can lead to:
|
|
68
|
+
- Security vulnerabilities (injection attacks)
|
|
69
|
+
- Data corruption (unexpected fields stored)
|
|
70
|
+
- API errors (YNAB API may reject unknown fields)
|
|
71
|
+
|
|
72
|
+
**What Breaks**: Missing `.strict()` → security vulnerability, unknown fields accepted.
|
|
73
|
+
|
|
74
|
+
### 2. Shared Schemas in `common.ts`
|
|
75
|
+
|
|
76
|
+
Common validation patterns are defined in `common.ts`:
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
// common.ts
|
|
80
|
+
import { z } from 'zod';
|
|
81
|
+
|
|
82
|
+
// Empty object schema (for tools with no input)
|
|
83
|
+
export const emptyObjectSchema = z.object({}).strict();
|
|
84
|
+
|
|
85
|
+
// Loose object schema (for passthrough scenarios)
|
|
86
|
+
export const looseObjectSchema = z.object({}).passthrough();
|
|
87
|
+
|
|
88
|
+
// Optional budget_id field (used across many tools)
|
|
89
|
+
export const budgetIdSchema = z.string().optional();
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Usage**:
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { emptyObjectSchema, budgetIdSchema } from './schemas/common.js';
|
|
96
|
+
|
|
97
|
+
// Tool with no input
|
|
98
|
+
const ListBudgetsSchema = emptyObjectSchema;
|
|
99
|
+
|
|
100
|
+
// Tool with budget_id
|
|
101
|
+
const GetBudgetSchema = z
|
|
102
|
+
.object({
|
|
103
|
+
budget_id: budgetIdSchema,
|
|
104
|
+
})
|
|
105
|
+
.strict();
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 3. Clear Validation Messages
|
|
109
|
+
|
|
110
|
+
Provide clear, actionable error messages for validation failures:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
const CreateTransactionSchema = z
|
|
114
|
+
.object({
|
|
115
|
+
amount: z
|
|
116
|
+
.number()
|
|
117
|
+
.refine((val) => Number.isFinite(val), {
|
|
118
|
+
message: 'Amount must be a finite number',
|
|
119
|
+
})
|
|
120
|
+
.refine((val) => val !== 0, {
|
|
121
|
+
message: 'Amount cannot be zero',
|
|
122
|
+
}),
|
|
123
|
+
|
|
124
|
+
date: z.string().refine(
|
|
125
|
+
(val) => /^\d{4}-\d{2}-\d{2}$/.test(val),
|
|
126
|
+
{
|
|
127
|
+
message: 'Date must be in ISO format (YYYY-MM-DD)',
|
|
128
|
+
}
|
|
129
|
+
),
|
|
130
|
+
})
|
|
131
|
+
.strict();
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Why Important**: Clear error messages help developers and users understand validation failures.
|
|
135
|
+
|
|
136
|
+
**What Breaks**: Generic errors → hard to debug, poor user experience.
|
|
137
|
+
|
|
138
|
+
### 4. Cross-Field Validation with `.refine()`
|
|
139
|
+
|
|
140
|
+
Use `.refine()` for validation that depends on multiple fields:
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
const ReconcileSchema = z
|
|
144
|
+
.object({
|
|
145
|
+
auto_create: z.boolean().optional(),
|
|
146
|
+
auto_update: z.boolean().optional(),
|
|
147
|
+
dry_run: z.boolean().optional(),
|
|
148
|
+
})
|
|
149
|
+
.strict()
|
|
150
|
+
.refine(
|
|
151
|
+
(data) => {
|
|
152
|
+
// Can't auto-create if dry_run is true
|
|
153
|
+
if (data.dry_run && data.auto_create) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
return true;
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
message: 'Cannot use auto_create with dry_run',
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
**Why Important**: Some validation rules depend on relationships between fields.
|
|
165
|
+
|
|
166
|
+
**What Breaks**: Missing cross-field validation → invalid state, API errors.
|
|
167
|
+
|
|
168
|
+
### 5. Output Schema Organization
|
|
169
|
+
|
|
170
|
+
Output schemas are organized by domain in the `outputs/` directory:
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// outputs/transactionOutput.ts
|
|
174
|
+
import { z } from 'zod';
|
|
175
|
+
|
|
176
|
+
export const TransactionOutputSchema = z.object({
|
|
177
|
+
id: z.string(),
|
|
178
|
+
date: z.string(),
|
|
179
|
+
amount: z.number(), // Milliunits!
|
|
180
|
+
memo: z.string().nullable(),
|
|
181
|
+
cleared: z.enum(['uncleared', 'cleared', 'reconciled']),
|
|
182
|
+
approved: z.boolean(),
|
|
183
|
+
payee_id: z.string().nullable(),
|
|
184
|
+
payee_name: z.string().nullable(),
|
|
185
|
+
category_id: z.string().nullable(),
|
|
186
|
+
category_name: z.string().nullable(),
|
|
187
|
+
account_id: z.string(),
|
|
188
|
+
account_name: z.string(),
|
|
189
|
+
deleted: z.boolean(),
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
export type TransactionOutput = z.infer<typeof TransactionOutputSchema>;
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**Why Important**: Validates API responses, catches unexpected data structures.
|
|
196
|
+
|
|
197
|
+
**What Breaks**: Missing output validation → runtime errors when API changes, uncaught malformed data.
|
|
198
|
+
|
|
199
|
+
### 6. Type Inference with `z.infer<>`
|
|
200
|
+
|
|
201
|
+
Always infer TypeScript types from Zod schemas:
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
// Define schema
|
|
205
|
+
const MySchema = z
|
|
206
|
+
.object({
|
|
207
|
+
field1: z.string(),
|
|
208
|
+
field2: z.number().optional(),
|
|
209
|
+
})
|
|
210
|
+
.strict();
|
|
211
|
+
|
|
212
|
+
// Infer TypeScript type
|
|
213
|
+
type MyType = z.infer<typeof MySchema>;
|
|
214
|
+
|
|
215
|
+
// Use in handler
|
|
216
|
+
async function handleMyTool(input: MyType): Promise<void> {
|
|
217
|
+
// input.field1 is string
|
|
218
|
+
// input.field2 is number | undefined
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Why Important**: Single source of truth for both runtime and compile-time validation.
|
|
223
|
+
|
|
224
|
+
**What Breaks**: Separate type definitions → type-runtime mismatch, maintenance burden.
|
|
225
|
+
|
|
226
|
+
## Common Development Tasks
|
|
227
|
+
|
|
228
|
+
### Adding a New Input Schema
|
|
229
|
+
|
|
230
|
+
When adding a new tool with input:
|
|
231
|
+
|
|
232
|
+
1. **Define schema** in the tool file:
|
|
233
|
+
```typescript
|
|
234
|
+
import { z } from 'zod';
|
|
235
|
+
|
|
236
|
+
const MyToolSchema = z
|
|
237
|
+
.object({
|
|
238
|
+
budget_id: z.string().optional(),
|
|
239
|
+
my_field: z.string(),
|
|
240
|
+
})
|
|
241
|
+
.strict(); // CRITICAL!
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
2. **Infer TypeScript type**:
|
|
245
|
+
```typescript
|
|
246
|
+
type MyToolInput = z.infer<typeof MyToolSchema>;
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
3. **Use in handler**:
|
|
250
|
+
```typescript
|
|
251
|
+
async function handleMyTool(
|
|
252
|
+
input: MyToolInput,
|
|
253
|
+
context: ToolContext
|
|
254
|
+
): Promise<MyToolOutput> {
|
|
255
|
+
// ...
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
4. **Register with tool**:
|
|
260
|
+
```typescript
|
|
261
|
+
registry.register({
|
|
262
|
+
name: 'my_tool',
|
|
263
|
+
inputSchema: MyToolSchema,
|
|
264
|
+
handler: adapt(handleMyTool, context),
|
|
265
|
+
});
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Adding a New Output Schema
|
|
269
|
+
|
|
270
|
+
When adding validation for tool output:
|
|
271
|
+
|
|
272
|
+
1. **Create schema** in `outputs/`:
|
|
273
|
+
```typescript
|
|
274
|
+
// outputs/myOutput.ts
|
|
275
|
+
import { z } from 'zod';
|
|
276
|
+
|
|
277
|
+
export const MyOutputSchema = z.object({
|
|
278
|
+
id: z.string(),
|
|
279
|
+
name: z.string(),
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
export type MyOutput = z.infer<typeof MyOutputSchema>;
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
2. **Use in handler**:
|
|
286
|
+
```typescript
|
|
287
|
+
import { MyOutputSchema, type MyOutput } from './schemas/outputs/myOutput.js';
|
|
288
|
+
|
|
289
|
+
async function handleMyTool(input: MyInput): Promise<MyOutput> {
|
|
290
|
+
const data = await fetchData();
|
|
291
|
+
return MyOutputSchema.parse(data); // Validates!
|
|
292
|
+
}
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### Adding Cross-Field Validation
|
|
296
|
+
|
|
297
|
+
When validation depends on multiple fields:
|
|
298
|
+
|
|
299
|
+
1. **Use `.refine()` after schema definition**:
|
|
300
|
+
```typescript
|
|
301
|
+
const MySchema = z
|
|
302
|
+
.object({
|
|
303
|
+
start_date: z.string(),
|
|
304
|
+
end_date: z.string(),
|
|
305
|
+
})
|
|
306
|
+
.strict()
|
|
307
|
+
.refine(
|
|
308
|
+
(data) => {
|
|
309
|
+
const start = new Date(data.start_date);
|
|
310
|
+
const end = new Date(data.end_date);
|
|
311
|
+
return start <= end;
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
message: 'start_date must be before or equal to end_date',
|
|
315
|
+
}
|
|
316
|
+
);
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Adding a Shared Schema
|
|
320
|
+
|
|
321
|
+
When multiple tools need the same validation pattern:
|
|
322
|
+
|
|
323
|
+
1. **Add to `common.ts`**:
|
|
324
|
+
```typescript
|
|
325
|
+
export const mySharedSchema = z.string().min(1).max(100);
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
2. **Import and use**:
|
|
329
|
+
```typescript
|
|
330
|
+
import { mySharedSchema } from './schemas/common.js';
|
|
331
|
+
|
|
332
|
+
const MyToolSchema = z
|
|
333
|
+
.object({
|
|
334
|
+
my_field: mySharedSchema,
|
|
335
|
+
})
|
|
336
|
+
.strict();
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
## Testing Approach
|
|
340
|
+
|
|
341
|
+
Schemas are tested through:
|
|
342
|
+
|
|
343
|
+
1. **Schema Validation Tests** - Test schema parsing and rejection
|
|
344
|
+
2. **Tool Integration Tests** - Verify schemas catch invalid inputs
|
|
345
|
+
3. **Output Validation Tests** - Ensure API responses match schemas
|
|
346
|
+
|
|
347
|
+
### Example Schema Test
|
|
348
|
+
|
|
349
|
+
```typescript
|
|
350
|
+
describe('CreateTransactionSchema', () => {
|
|
351
|
+
it('should accept valid input', () => {
|
|
352
|
+
const validInput = {
|
|
353
|
+
account_id: 'acc123',
|
|
354
|
+
amount: 25.5,
|
|
355
|
+
date: '2025-01-31',
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
expect(() => CreateTransactionSchema.parse(validInput)).not.toThrow();
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('should reject invalid date format', () => {
|
|
362
|
+
const invalidInput = {
|
|
363
|
+
account_id: 'acc123',
|
|
364
|
+
amount: 25.5,
|
|
365
|
+
date: '01/31/2025', // Wrong format!
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
expect(() => CreateTransactionSchema.parse(invalidInput)).toThrow();
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
it('should reject unknown fields', () => {
|
|
372
|
+
const invalidInput = {
|
|
373
|
+
account_id: 'acc123',
|
|
374
|
+
amount: 25.5,
|
|
375
|
+
date: '2025-01-31',
|
|
376
|
+
unknown_field: 'value', // Unknown field!
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
expect(() => CreateTransactionSchema.parse(invalidInput)).toThrow();
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
## What Will Break If Violated
|
|
385
|
+
|
|
386
|
+
### 1. Missing `.strict()` on Input Schemas
|
|
387
|
+
|
|
388
|
+
**Problem**: Input schemas without `.strict()` modifier.
|
|
389
|
+
|
|
390
|
+
**Impact**: SECURITY VULNERABILITY - Unknown fields accepted, potential injection attacks.
|
|
391
|
+
|
|
392
|
+
**Fix**: Always use `.strict()` on input schemas:
|
|
393
|
+
|
|
394
|
+
```typescript
|
|
395
|
+
// BAD (security vulnerability)
|
|
396
|
+
const MySchema = z.object({
|
|
397
|
+
field: z.string(),
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
// GOOD (secure)
|
|
401
|
+
const MySchema = z
|
|
402
|
+
.object({
|
|
403
|
+
field: z.string(),
|
|
404
|
+
})
|
|
405
|
+
.strict();
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### 2. Separate Type Definitions
|
|
409
|
+
|
|
410
|
+
**Problem**: Defining TypeScript types separately from Zod schemas.
|
|
411
|
+
|
|
412
|
+
**Impact**: Type-runtime mismatch, maintenance burden, validation bugs.
|
|
413
|
+
|
|
414
|
+
**Fix**: Always infer types from schemas:
|
|
415
|
+
|
|
416
|
+
```typescript
|
|
417
|
+
// BAD (separate definitions)
|
|
418
|
+
interface MyType {
|
|
419
|
+
field: string;
|
|
420
|
+
}
|
|
421
|
+
const MySchema = z.object({ field: z.string() });
|
|
422
|
+
|
|
423
|
+
// GOOD (single source of truth)
|
|
424
|
+
const MySchema = z.object({ field: z.string() }).strict();
|
|
425
|
+
type MyType = z.infer<typeof MySchema>;
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### 3. Missing Output Validation
|
|
429
|
+
|
|
430
|
+
**Problem**: Not validating API responses with output schemas.
|
|
431
|
+
|
|
432
|
+
**Impact**: Runtime errors when API changes, uncaught malformed data.
|
|
433
|
+
|
|
434
|
+
**Fix**: Validate all API responses:
|
|
435
|
+
|
|
436
|
+
```typescript
|
|
437
|
+
// BAD (no validation)
|
|
438
|
+
async function handleMyTool(input: MyInput): Promise<MyOutput> {
|
|
439
|
+
const data = await api.fetchData();
|
|
440
|
+
return data; // Unvalidated!
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
// GOOD (validated)
|
|
444
|
+
async function handleMyTool(input: MyInput): Promise<MyOutput> {
|
|
445
|
+
const data = await api.fetchData();
|
|
446
|
+
return MyOutputSchema.parse(data); // Validates!
|
|
447
|
+
}
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### 4. Generic Validation Error Messages
|
|
451
|
+
|
|
452
|
+
**Problem**: Using default Zod error messages without customization.
|
|
453
|
+
|
|
454
|
+
**Impact**: Poor developer experience, hard to debug validation failures.
|
|
455
|
+
|
|
456
|
+
**Fix**: Provide clear, actionable error messages:
|
|
457
|
+
|
|
458
|
+
```typescript
|
|
459
|
+
// BAD (generic error)
|
|
460
|
+
amount: z.number();
|
|
461
|
+
|
|
462
|
+
// GOOD (clear error)
|
|
463
|
+
amount: z.number().refine((val) => Number.isFinite(val), {
|
|
464
|
+
message: 'Amount must be a finite number (not NaN or Infinity)',
|
|
465
|
+
});
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
### 5. Missing Cross-Field Validation
|
|
469
|
+
|
|
470
|
+
**Problem**: Not validating relationships between fields.
|
|
471
|
+
|
|
472
|
+
**Impact**: Invalid state accepted, API errors, data corruption.
|
|
473
|
+
|
|
474
|
+
**Fix**: Use `.refine()` for cross-field validation:
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
const MySchema = z
|
|
478
|
+
.object({
|
|
479
|
+
min: z.number(),
|
|
480
|
+
max: z.number(),
|
|
481
|
+
})
|
|
482
|
+
.strict()
|
|
483
|
+
.refine((data) => data.min <= data.max, {
|
|
484
|
+
message: 'min must be less than or equal to max',
|
|
485
|
+
});
|
|
486
|
+
```
|
|
487
|
+
|
|
488
|
+
### 6. Overly Permissive Schemas
|
|
489
|
+
|
|
490
|
+
**Problem**: Using `.passthrough()` when `.strict()` should be used.
|
|
491
|
+
|
|
492
|
+
**Impact**: Unknown fields silently accepted, potential security issues.
|
|
493
|
+
|
|
494
|
+
**Fix**: Use `.strict()` for input validation, `.passthrough()` only for specific cases:
|
|
495
|
+
|
|
496
|
+
```typescript
|
|
497
|
+
// Input schemas (ALWAYS .strict())
|
|
498
|
+
const InputSchema = z.object({ field: z.string() }).strict();
|
|
499
|
+
|
|
500
|
+
// Output schemas (MAY use .passthrough() if needed)
|
|
501
|
+
const OutputSchema = z.object({ field: z.string() }).passthrough();
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## Validation Best Practices
|
|
505
|
+
|
|
506
|
+
1. **Always `.strict()` on Inputs** - Security requirement
|
|
507
|
+
2. **Infer Types from Schemas** - Single source of truth
|
|
508
|
+
3. **Validate Outputs** - Catch API changes early
|
|
509
|
+
4. **Clear Error Messages** - Help debugging
|
|
510
|
+
5. **Cross-Field Validation** - Use `.refine()` when needed
|
|
511
|
+
6. **Share Common Patterns** - DRY via `common.ts`
|
|
512
|
+
|
|
513
|
+
## Integration Points
|
|
514
|
+
|
|
515
|
+
### With Tools (`src/tools/`)
|
|
516
|
+
|
|
517
|
+
- **Input Validation**: All tool inputs validated via Zod schemas
|
|
518
|
+
- **Output Validation**: Optional validation of API responses
|
|
519
|
+
- **Type Inference**: Tool handlers use `z.infer<>` types
|
|
520
|
+
|
|
521
|
+
### With Server (`src/server/`)
|
|
522
|
+
|
|
523
|
+
- **Tool Registry**: Schemas passed to `registry.register()`
|
|
524
|
+
- **Security Middleware**: Uses schemas for validation
|
|
525
|
+
- **Error Handling**: Zod validation errors formatted by errorHandler
|
|
526
|
+
|
|
527
|
+
### With Types (`src/types/`)
|
|
528
|
+
|
|
529
|
+
- **Type Generation**: Schemas generate TypeScript types
|
|
530
|
+
- **Runtime Validation**: Bridge between types and runtime
|
|
531
|
+
|
|
532
|
+
## Performance Considerations
|
|
533
|
+
|
|
534
|
+
Schema validation has performance implications:
|
|
535
|
+
|
|
536
|
+
1. **Parse vs. SafeParse**: Use `.parse()` for expected valid data, `.safeParse()` for uncertain data
|
|
537
|
+
2. **Output Validation**: Consider skipping for high-frequency tools (if API is trusted)
|
|
538
|
+
3. **Complex Refinements**: Minimize expensive validation logic in `.refine()`
|
|
539
|
+
4. **Schema Composition**: Reuse schemas instead of duplicating
|
|
540
|
+
|
|
541
|
+
## Related Documentation
|
|
542
|
+
|
|
543
|
+
- [Root CLAUDE.md](../../../CLAUDE.md) - Project overview
|
|
544
|
+
- [Tools CLAUDE.md](../CLAUDE.md) - Tool implementation using these schemas
|
|
545
|
+
- [Types CLAUDE.md](../../types/CLAUDE.md) - Type definitions
|
|
546
|
+
- [Server CLAUDE.md](../../server/CLAUDE.md) - Server components
|