@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,38 +1,43 @@
|
|
|
1
|
-
import { CallToolResult } from
|
|
2
|
-
import * as ynab from
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type * as ynab from "ynab";
|
|
3
|
+
import type { ErrorHandler } from "../server/errorHandler.js";
|
|
4
|
+
import { responseFormatter } from "../server/responseFormatter.js";
|
|
5
|
+
import { withToolErrorHandling } from "../types/index.js";
|
|
6
|
+
import type { ToolFactory } from "../types/toolRegistration.js";
|
|
7
|
+
import { createAdapters } from "./adapters.js";
|
|
8
|
+
import { emptyObjectSchema } from "./schemas/common.js";
|
|
9
|
+
import { ToolAnnotationPresets } from "./toolCategories.js";
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Handles the ynab:get_user tool call
|
|
12
13
|
* Gets information about the authenticated user
|
|
13
14
|
*/
|
|
14
|
-
export async function handleGetUser(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
export async function handleGetUser(
|
|
16
|
+
ynabAPI: ynab.API,
|
|
17
|
+
errorHandler?: ErrorHandler,
|
|
18
|
+
): Promise<CallToolResult> {
|
|
19
|
+
return await withToolErrorHandling(
|
|
20
|
+
async () => {
|
|
21
|
+
const response = await ynabAPI.user.getUser();
|
|
22
|
+
const userInfo = response.data.user;
|
|
19
23
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
const user = {
|
|
25
|
+
id: userInfo.id,
|
|
26
|
+
};
|
|
23
27
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
return {
|
|
29
|
+
content: [
|
|
30
|
+
{
|
|
31
|
+
type: "text",
|
|
32
|
+
text: responseFormatter.format({ user }),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
"ynab:get_user",
|
|
38
|
+
"getting user information",
|
|
39
|
+
errorHandler,
|
|
40
|
+
);
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
/**
|
|
@@ -42,18 +47,18 @@ export async function handleGetUser(ynabAPI: ynab.API): Promise<CallToolResult>
|
|
|
42
47
|
* amounts in dollars (converted from YNAB milliunits internally).
|
|
43
48
|
*/
|
|
44
49
|
export const registerUtilityTools: ToolFactory = (registry, context) => {
|
|
45
|
-
|
|
50
|
+
const { adaptNoInput } = createAdapters(context);
|
|
46
51
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
52
|
+
registry.register({
|
|
53
|
+
name: "get_user",
|
|
54
|
+
description: "Get information about the authenticated user",
|
|
55
|
+
inputSchema: emptyObjectSchema,
|
|
56
|
+
handler: adaptNoInput(handleGetUser),
|
|
57
|
+
metadata: {
|
|
58
|
+
annotations: {
|
|
59
|
+
...ToolAnnotationPresets.READ_ONLY_EXTERNAL,
|
|
60
|
+
title: "YNAB: Get User Information",
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
59
64
|
};
|
|
@@ -0,0 +1,477 @@
|
|
|
1
|
+
# Type Definitions - YNAB MCP Server
|
|
2
|
+
|
|
3
|
+
This directory contains centralized TypeScript type definitions and interfaces used throughout the YNAB MCP Server codebase.
|
|
4
|
+
|
|
5
|
+
## Purpose & Responsibilities
|
|
6
|
+
|
|
7
|
+
The `src/types/` directory provides:
|
|
8
|
+
|
|
9
|
+
1. **Shared Types** - Common types, interfaces, and enums used across modules
|
|
10
|
+
2. **ToolContext** - Central dependency injection object for tool handlers
|
|
11
|
+
3. **Handler Signatures** - Type-safe handler function signatures
|
|
12
|
+
4. **Error Classes** - Custom error types with context
|
|
13
|
+
5. **Domain Types** - Reconciliation, caching, and configuration types
|
|
14
|
+
|
|
15
|
+
## Key Files & Responsibilities
|
|
16
|
+
|
|
17
|
+
| File | Responsibility | Lines | Critical |
|
|
18
|
+
|------|---------------|-------|----------|
|
|
19
|
+
| **index.ts** | Shared types, error classes, server configuration | ~300 | HIGH |
|
|
20
|
+
| **toolRegistration.ts** | ToolContext, handler signatures (Handler, DeltaHandler, etc.) | ~200 | CRITICAL |
|
|
21
|
+
| **toolAnnotations.ts** | MCP annotation types and interfaces | ~100 | MEDIUM |
|
|
22
|
+
| **reconciliation.ts** | Reconciliation-specific type definitions | ~150 | MEDIUM |
|
|
23
|
+
|
|
24
|
+
## Critical Patterns & Conventions
|
|
25
|
+
|
|
26
|
+
### 1. ToolContext - Central Dependency Injection Object
|
|
27
|
+
|
|
28
|
+
`ToolContext` is the heart of the dependency injection pattern, providing all shared dependencies to tool handlers:
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
export interface ToolContext {
|
|
32
|
+
// YNAB API client
|
|
33
|
+
ynabAPI: ynab.API;
|
|
34
|
+
|
|
35
|
+
// Delta caching (efficient updates)
|
|
36
|
+
deltaFetcher: DeltaFetcher;
|
|
37
|
+
deltaCache: DeltaCache;
|
|
38
|
+
serverKnowledgeStore: ServerKnowledgeStore;
|
|
39
|
+
|
|
40
|
+
// Default budget management
|
|
41
|
+
getDefaultBudgetId: () => string | null;
|
|
42
|
+
setDefaultBudgetId: (budgetId: string | null) => void;
|
|
43
|
+
|
|
44
|
+
// Cache and diagnostics
|
|
45
|
+
cacheManager: CacheManager;
|
|
46
|
+
diagnosticsManager: DiagnosticsManager;
|
|
47
|
+
|
|
48
|
+
// Error handling
|
|
49
|
+
errorHandler: ErrorHandler;
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Why Critical**: All tool handlers receive this context via adapters. Any changes to ToolContext affect all tools.
|
|
54
|
+
|
|
55
|
+
**What Breaks**: Adding required fields → all adapters break. Removing fields → tool handlers fail. Circular dependencies → build errors.
|
|
56
|
+
|
|
57
|
+
### 2. Handler Signatures
|
|
58
|
+
|
|
59
|
+
Type-safe handler function signatures ensure consistent tool implementations:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
// Standard handler (read-only, with input)
|
|
63
|
+
export type Handler<TInput, TOutput> = (
|
|
64
|
+
input: TInput,
|
|
65
|
+
context: ToolContext
|
|
66
|
+
) => Promise<TOutput>;
|
|
67
|
+
|
|
68
|
+
// Delta-aware handler (supports delta caching)
|
|
69
|
+
export type DeltaHandler<TInput, TOutput> = (
|
|
70
|
+
input: TInput,
|
|
71
|
+
context: ToolContext,
|
|
72
|
+
serverKnowledge?: number
|
|
73
|
+
) => Promise<{ data: TOutput; server_knowledge?: number }>;
|
|
74
|
+
|
|
75
|
+
// Write handler (supports progress notifications)
|
|
76
|
+
export type WriteHandler<TInput, TOutput> = (
|
|
77
|
+
input: TInput,
|
|
78
|
+
context: ToolContext,
|
|
79
|
+
sendProgress?: ProgressCallback
|
|
80
|
+
) => Promise<TOutput>;
|
|
81
|
+
|
|
82
|
+
// No-input handler (e.g., list_budgets, get_user)
|
|
83
|
+
export type NoInputHandler<TOutput> = (
|
|
84
|
+
context: ToolContext
|
|
85
|
+
) => Promise<TOutput>;
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
**Why Critical**: Ensures type safety across all tool handlers. TypeScript catches signature mismatches at compile time.
|
|
89
|
+
|
|
90
|
+
**What Breaks**: Wrong signature → type errors. Missing parameters → runtime errors.
|
|
91
|
+
|
|
92
|
+
### 3. Error Classes with Context
|
|
93
|
+
|
|
94
|
+
Custom error classes extend `BaseError` with contextual information:
|
|
95
|
+
|
|
96
|
+
```typescript
|
|
97
|
+
export class BaseError extends Error {
|
|
98
|
+
constructor(
|
|
99
|
+
message: string,
|
|
100
|
+
public readonly code: string,
|
|
101
|
+
public readonly context?: Record<string, unknown>
|
|
102
|
+
) {
|
|
103
|
+
super(message);
|
|
104
|
+
this.name = this.constructor.name;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export class ValidationError extends BaseError {
|
|
109
|
+
constructor(message: string, context?: Record<string, unknown>) {
|
|
110
|
+
super(message, 'VALIDATION_ERROR', context);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export class BudgetNotFoundError extends BaseError {
|
|
115
|
+
constructor(budgetId: string) {
|
|
116
|
+
super(`Budget ${budgetId} not found`, 'BUDGET_NOT_FOUND', { budgetId });
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Why Important**: Provides structured error information for logging, debugging, and client error handling.
|
|
122
|
+
|
|
123
|
+
**What Breaks**: Not extending BaseError → inconsistent error format. Missing context → harder debugging.
|
|
124
|
+
|
|
125
|
+
### 4. MCP Annotation Types
|
|
126
|
+
|
|
127
|
+
MCP annotation types follow the Model Context Protocol specification:
|
|
128
|
+
|
|
129
|
+
```typescript
|
|
130
|
+
export interface ToolAnnotations {
|
|
131
|
+
// Human-readable title for UI display
|
|
132
|
+
title?: string;
|
|
133
|
+
|
|
134
|
+
// Advisory hints (not enforced, AI clients decide)
|
|
135
|
+
readOnlyHint?: boolean; // Tool only reads data
|
|
136
|
+
destructiveHint?: boolean; // Tool performs irreversible operations
|
|
137
|
+
idempotentHint?: boolean; // Repeated calls are safe
|
|
138
|
+
openWorldHint?: boolean; // Tool calls external APIs
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export const ToolAnnotationPresets = {
|
|
142
|
+
READ_ONLY_EXTERNAL: {
|
|
143
|
+
readOnlyHint: true,
|
|
144
|
+
destructiveHint: false,
|
|
145
|
+
idempotentHint: true,
|
|
146
|
+
openWorldHint: true,
|
|
147
|
+
},
|
|
148
|
+
WRITE_EXTERNAL_DELETE: {
|
|
149
|
+
readOnlyHint: false,
|
|
150
|
+
destructiveHint: true,
|
|
151
|
+
idempotentHint: true,
|
|
152
|
+
openWorldHint: true,
|
|
153
|
+
},
|
|
154
|
+
// ... more presets
|
|
155
|
+
};
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Why Important**: Helps AI assistants understand tool safety characteristics and expected behavior.
|
|
159
|
+
|
|
160
|
+
**What Breaks**: Wrong hints → AI makes poor decisions about tool usage.
|
|
161
|
+
|
|
162
|
+
### 5. Reconciliation Types
|
|
163
|
+
|
|
164
|
+
Reconciliation types define the structure of reconciliation inputs, outputs, and intermediate results:
|
|
165
|
+
|
|
166
|
+
```typescript
|
|
167
|
+
export interface ReconcileInput {
|
|
168
|
+
budget_id?: string;
|
|
169
|
+
account_id: string;
|
|
170
|
+
csv_data: string;
|
|
171
|
+
bank_preset?: 'TD' | 'RBC' | 'SCOTIABANK' | 'WEALTHSIMPLE' | 'TANGERINE';
|
|
172
|
+
auto_create?: boolean;
|
|
173
|
+
auto_update?: boolean;
|
|
174
|
+
dry_run?: boolean;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export interface ReconcileResult {
|
|
178
|
+
// Summary statistics
|
|
179
|
+
total_csv_transactions: number;
|
|
180
|
+
total_ynab_transactions: number;
|
|
181
|
+
ynab_in_range_count: number;
|
|
182
|
+
ynab_outside_range_count: number;
|
|
183
|
+
|
|
184
|
+
// Match statistics
|
|
185
|
+
matched_count: number;
|
|
186
|
+
auto_matched_count: number;
|
|
187
|
+
manual_review_count: number;
|
|
188
|
+
|
|
189
|
+
// Discrepancy statistics
|
|
190
|
+
discrepancies_count: number;
|
|
191
|
+
missing_from_bank_count: number;
|
|
192
|
+
missing_from_ynab_count: number;
|
|
193
|
+
duplicates_count: number;
|
|
194
|
+
|
|
195
|
+
// Bulk operation results
|
|
196
|
+
created_count: number;
|
|
197
|
+
updated_count: number;
|
|
198
|
+
uncleared_count: number;
|
|
199
|
+
failed_count: number;
|
|
200
|
+
|
|
201
|
+
// Detailed results
|
|
202
|
+
matches: Match[];
|
|
203
|
+
discrepancies: Discrepancy[];
|
|
204
|
+
errors: BulkError[];
|
|
205
|
+
recommendations: Recommendation[];
|
|
206
|
+
|
|
207
|
+
// Report
|
|
208
|
+
report: string;
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Why Important**: Defines contract between reconciliation tool and clients.
|
|
213
|
+
|
|
214
|
+
**What Breaks**: Changing field names → clients break. Missing required fields → validation errors.
|
|
215
|
+
|
|
216
|
+
## Common Development Tasks
|
|
217
|
+
|
|
218
|
+
### Adding a New Type to ToolContext
|
|
219
|
+
|
|
220
|
+
When adding a new shared dependency:
|
|
221
|
+
|
|
222
|
+
1. **Add to ToolContext interface** in `toolRegistration.ts`:
|
|
223
|
+
```typescript
|
|
224
|
+
export interface ToolContext {
|
|
225
|
+
// ... existing fields
|
|
226
|
+
myNewService: MyNewService; // Add here
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
2. **Update ToolContext creation** in `YNABMCPServer.ts`:
|
|
231
|
+
```typescript
|
|
232
|
+
const toolContext: ToolContext = {
|
|
233
|
+
// ... existing fields
|
|
234
|
+
myNewService: this.myNewService, // Provide instance
|
|
235
|
+
};
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
3. **Update all test mocks**:
|
|
239
|
+
```typescript
|
|
240
|
+
const mockContext: ToolContext = {
|
|
241
|
+
// ... existing mocks
|
|
242
|
+
myNewService: createMockService(),
|
|
243
|
+
};
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Adding a New Handler Signature
|
|
247
|
+
|
|
248
|
+
When adding a new handler pattern:
|
|
249
|
+
|
|
250
|
+
1. **Define type** in `toolRegistration.ts`:
|
|
251
|
+
```typescript
|
|
252
|
+
export type MyNewHandler<TInput, TOutput> = (
|
|
253
|
+
input: TInput,
|
|
254
|
+
context: ToolContext,
|
|
255
|
+
myNewParam: MyType
|
|
256
|
+
) => Promise<TOutput>;
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
2. **Create adapter** in `src/tools/adapters.ts`:
|
|
260
|
+
```typescript
|
|
261
|
+
export function adaptMyNew<TInput, TOutput>(
|
|
262
|
+
handler: MyNewHandler<TInput, TOutput>,
|
|
263
|
+
context: ToolContext
|
|
264
|
+
): (input: TInput, myNewParam: MyType) => Promise<TOutput> {
|
|
265
|
+
return async (input, myNewParam) => handler(input, context, myNewParam);
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
3. **Use in tool registration**:
|
|
270
|
+
```typescript
|
|
271
|
+
registry.register({
|
|
272
|
+
name: 'my_tool',
|
|
273
|
+
handler: adaptMyNew(handleMyTool, context),
|
|
274
|
+
});
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### Adding a New Error Class
|
|
278
|
+
|
|
279
|
+
When adding a new error type:
|
|
280
|
+
|
|
281
|
+
1. **Extend BaseError** in `src/utils/errors.ts`:
|
|
282
|
+
```typescript
|
|
283
|
+
export class MyNewError extends BaseError {
|
|
284
|
+
constructor(message: string, context?: Record<string, unknown>) {
|
|
285
|
+
super(message, 'MY_NEW_ERROR', context);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
2. **Export from `src/types/index.ts`**:
|
|
291
|
+
```typescript
|
|
292
|
+
export { MyNewError } from '../utils/errors.js';
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
3. **Use in error handling**:
|
|
296
|
+
```typescript
|
|
297
|
+
throw new MyNewError('Something went wrong', { foo: 'bar' });
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Adding Domain-Specific Types
|
|
301
|
+
|
|
302
|
+
When adding types for a specific domain (e.g., new reconciliation types):
|
|
303
|
+
|
|
304
|
+
1. **Create new file** in `src/types/` (e.g., `myDomain.ts`):
|
|
305
|
+
```typescript
|
|
306
|
+
export interface MyDomainInput {
|
|
307
|
+
field1: string;
|
|
308
|
+
field2: number;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export interface MyDomainOutput {
|
|
312
|
+
result: string;
|
|
313
|
+
}
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
2. **Export from `index.ts`**:
|
|
317
|
+
```typescript
|
|
318
|
+
export * from './myDomain.js';
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
3. **Use in tool handlers**:
|
|
322
|
+
```typescript
|
|
323
|
+
import type { MyDomainInput, MyDomainOutput } from '../types/index.js';
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Testing Approach
|
|
327
|
+
|
|
328
|
+
Type definitions are tested implicitly through:
|
|
329
|
+
|
|
330
|
+
1. **TypeScript Compilation** - Type errors caught at compile time
|
|
331
|
+
2. **Unit Tests** - Ensure types match runtime behavior
|
|
332
|
+
3. **Integration Tests** - Verify type safety across module boundaries
|
|
333
|
+
|
|
334
|
+
### Example Type Test
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
describe('ToolContext', () => {
|
|
338
|
+
it('should provide all required dependencies', () => {
|
|
339
|
+
const context: ToolContext = createTestContext();
|
|
340
|
+
|
|
341
|
+
expect(context.ynabAPI).toBeDefined();
|
|
342
|
+
expect(context.cacheManager).toBeDefined();
|
|
343
|
+
expect(context.errorHandler).toBeDefined();
|
|
344
|
+
expect(context.getDefaultBudgetId).toBeInstanceOf(Function);
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## What Will Break If Violated
|
|
350
|
+
|
|
351
|
+
### 1. Breaking ToolContext Changes
|
|
352
|
+
|
|
353
|
+
**Problem**: Adding required fields to ToolContext without updating all usage sites.
|
|
354
|
+
|
|
355
|
+
**Impact**: All tool factories break, compilation errors, runtime failures.
|
|
356
|
+
|
|
357
|
+
**Fix**: When adding to ToolContext:
|
|
358
|
+
|
|
359
|
+
1. Make new fields **optional** initially
|
|
360
|
+
2. Update all creation sites
|
|
361
|
+
3. Make required after migration
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
// PHASE 1: Add as optional
|
|
365
|
+
export interface ToolContext {
|
|
366
|
+
myNewField?: MyType;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// PHASE 2: Make required after all sites updated
|
|
370
|
+
export interface ToolContext {
|
|
371
|
+
myNewField: MyType;
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### 2. Circular Dependencies
|
|
376
|
+
|
|
377
|
+
**Problem**: Type files importing from modules that import from types.
|
|
378
|
+
|
|
379
|
+
**Impact**: Build errors, module resolution failures.
|
|
380
|
+
|
|
381
|
+
**Fix**: Types should **never** import from implementation files. Only import other types.
|
|
382
|
+
|
|
383
|
+
```typescript
|
|
384
|
+
// BAD (circular dependency)
|
|
385
|
+
import { CacheManager } from '../server/cacheManager.js';
|
|
386
|
+
|
|
387
|
+
// GOOD (type-only import)
|
|
388
|
+
import type { CacheManager } from '../server/cacheManager.js';
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### 3. Inconsistent Handler Signatures
|
|
392
|
+
|
|
393
|
+
**Problem**: Tool handlers not matching type signatures.
|
|
394
|
+
|
|
395
|
+
**Impact**: Type errors, adapter failures, runtime errors.
|
|
396
|
+
|
|
397
|
+
**Fix**: Always use correct handler signature:
|
|
398
|
+
|
|
399
|
+
```typescript
|
|
400
|
+
// BAD (missing context)
|
|
401
|
+
async function handleMyTool(input: MyInput): Promise<MyOutput>
|
|
402
|
+
|
|
403
|
+
// GOOD (matches Handler<TInput, TOutput>)
|
|
404
|
+
async function handleMyTool(
|
|
405
|
+
input: MyInput,
|
|
406
|
+
context: ToolContext
|
|
407
|
+
): Promise<MyOutput>
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
### 4. Missing Error Context
|
|
411
|
+
|
|
412
|
+
**Problem**: Creating errors without context information.
|
|
413
|
+
|
|
414
|
+
**Impact**: Harder debugging, poor error messages, no traceability.
|
|
415
|
+
|
|
416
|
+
**Fix**: Always provide context when throwing errors:
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
// BAD (no context)
|
|
420
|
+
throw new BudgetNotFoundError('Budget not found');
|
|
421
|
+
|
|
422
|
+
// GOOD (with context)
|
|
423
|
+
throw new BudgetNotFoundError(budgetId);
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
### 5. Type-Runtime Mismatch
|
|
427
|
+
|
|
428
|
+
**Problem**: TypeScript types don't match actual runtime values.
|
|
429
|
+
|
|
430
|
+
**Impact**: Type safety illusion, runtime errors despite type checks.
|
|
431
|
+
|
|
432
|
+
**Fix**: Use Zod schemas for runtime validation:
|
|
433
|
+
|
|
434
|
+
```typescript
|
|
435
|
+
// Define both type and schema
|
|
436
|
+
export const MySchema = z.object({
|
|
437
|
+
field: z.string(),
|
|
438
|
+
});
|
|
439
|
+
export type MyType = z.infer<typeof MySchema>;
|
|
440
|
+
|
|
441
|
+
// Validate at runtime
|
|
442
|
+
const validated = MySchema.parse(input);
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
## Type Safety Best Practices
|
|
446
|
+
|
|
447
|
+
1. **Use `strict: true`** in tsconfig.json (already enabled)
|
|
448
|
+
2. **Avoid `any` type** - Use `unknown` if type is truly unknown
|
|
449
|
+
3. **Use type-only imports** - Prevents circular dependencies
|
|
450
|
+
4. **Prefer interfaces over types** - Better error messages, easier to extend
|
|
451
|
+
5. **Use Zod for runtime validation** - Bridge between types and runtime
|
|
452
|
+
|
|
453
|
+
## Integration Points
|
|
454
|
+
|
|
455
|
+
### With Server (`src/server/`)
|
|
456
|
+
|
|
457
|
+
- **ToolContext**: Created in YNABMCPServer, injected into tools
|
|
458
|
+
- **Error Classes**: Used by errorHandler for consistent responses
|
|
459
|
+
- **Configuration Types**: Define server configuration structure
|
|
460
|
+
|
|
461
|
+
### With Tools (`src/tools/`)
|
|
462
|
+
|
|
463
|
+
- **Handler Signatures**: All tool handlers follow these types
|
|
464
|
+
- **ToolContext**: Injected via adapters
|
|
465
|
+
- **Domain Types**: Reconciliation, transaction, budget types
|
|
466
|
+
|
|
467
|
+
### With Utils (`src/utils/`)
|
|
468
|
+
|
|
469
|
+
- **Error Classes**: Defined in utils, exported from types
|
|
470
|
+
- **Shared Interfaces**: Money, date, validation types
|
|
471
|
+
|
|
472
|
+
## Related Documentation
|
|
473
|
+
|
|
474
|
+
- [Root CLAUDE.md](../../CLAUDE.md) - Project overview
|
|
475
|
+
- [Server CLAUDE.md](../server/CLAUDE.md) - Server components and ToolContext creation
|
|
476
|
+
- [Tools CLAUDE.md](../tools/CLAUDE.md) - Tool implementation using these types
|
|
477
|
+
- [Utils CLAUDE.md](../utils/CLAUDE.md) - Utility types and helpers
|
|
@@ -1,52 +1,52 @@
|
|
|
1
|
-
import { describe,
|
|
2
|
-
import { AuthenticationError, ConfigurationError } from
|
|
3
|
-
|
|
4
|
-
describe(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { AuthenticationError, ConfigurationError } from "../index";
|
|
3
|
+
|
|
4
|
+
describe("Error Classes", () => {
|
|
5
|
+
describe("AuthenticationError", () => {
|
|
6
|
+
it("should create error with correct name and message", () => {
|
|
7
|
+
const message = "Invalid access token";
|
|
8
|
+
const error = new AuthenticationError(message);
|
|
9
|
+
|
|
10
|
+
expect(error).toBeInstanceOf(Error);
|
|
11
|
+
expect(error).toBeInstanceOf(AuthenticationError);
|
|
12
|
+
expect(error.name).toBe("AuthenticationError");
|
|
13
|
+
expect(error.message).toBe(message);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("should be throwable and catchable", () => {
|
|
17
|
+
const message = "Token expired";
|
|
18
|
+
|
|
19
|
+
expect(() => {
|
|
20
|
+
throw new AuthenticationError(message);
|
|
21
|
+
}).toThrow(AuthenticationError);
|
|
22
|
+
|
|
23
|
+
expect(() => {
|
|
24
|
+
throw new AuthenticationError(message);
|
|
25
|
+
}).toThrow(message);
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
describe("ConfigurationError", () => {
|
|
30
|
+
it("should create error with correct name and message", () => {
|
|
31
|
+
const message = "Missing environment variable";
|
|
32
|
+
const error = new ConfigurationError(message);
|
|
33
|
+
|
|
34
|
+
expect(error).toBeInstanceOf(Error);
|
|
35
|
+
expect(error).toBeInstanceOf(ConfigurationError);
|
|
36
|
+
expect(error.name).toBe("ConfigurationError");
|
|
37
|
+
expect(error.message).toBe(message);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("should be throwable and catchable", () => {
|
|
41
|
+
const message = "Invalid configuration";
|
|
42
|
+
|
|
43
|
+
expect(() => {
|
|
44
|
+
throw new ConfigurationError(message);
|
|
45
|
+
}).toThrow(ConfigurationError);
|
|
46
|
+
|
|
47
|
+
expect(() => {
|
|
48
|
+
throw new ConfigurationError(message);
|
|
49
|
+
}).toThrow(message);
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
52
|
});
|