@dizzlkheinz/ynab-mcpb 0.12.1
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/.chunkhound.json +11 -0
- package/.code/agents/0427d95e-edca-431f-a214-5e53264e29c4/error.txt +8 -0
- package/.code/agents/0d675174-d1e1-41c3-9975-4c2e275819a9/error.txt +3 -0
- package/.code/agents/0d8c5afd-4787-422b-abf8-2e5943fc7e67/error.txt +3 -0
- package/.code/agents/0ec34a70-ed5d-4b9e-bee4-bb0e4cccbc4b/error.txt +1 -0
- package/.code/agents/0ef51a21-1ab1-49d7-9561-0eaa43875ebc/error.txt +12 -0
- package/.code/agents/15db95d7-abad-4b4d-9c3b-8446089cb61d/error.txt +1 -0
- package/.code/agents/19ab9acb-f675-4ff0-902a-09a5476f8149/error.txt +1 -0
- package/.code/agents/1ef7e12d-f6ff-4897-8a9b-152d523d898e/error.txt +5 -0
- package/.code/agents/2465/exec-call_lroN9KKzJVWC7t5423DK1nT9.txt +1453 -0
- package/.code/agents/28edb6fe-95a9-41a0-ae69-aa0100d26c0c/error.txt +8 -0
- package/.code/agents/2ae40cf5-b4bf-42e2-92bf-7ea350a7755e/error.txt +9 -0
- package/.code/agents/2bfc4e1f-ac4b-45a5-b6df-bf89d4dbb54c/error.txt +1 -0
- package/.code/agents/2e2e1134-eff0-49be-ba25-8e2c3468a564/error.txt +5 -0
- package/.code/agents/3/exec-call_203OC4TNVkLxW7z2HCVEQ1cM.txt +81 -0
- package/.code/agents/3/exec-call_SS5T0XSiXB4LSNzUKTl75wkh.txt +610 -0
- package/.code/agents/3322c003-ce5e-48e3-a342-f5049c5bf9a2/error.txt +1 -0
- package/.code/agents/391e9b08-1ebc-468c-9bcd-6d0cc3193b37/error.txt +1 -0
- package/.code/agents/3ab0aa84-b7bb-4054-afa3-40b8fd7d3be0/error.txt +1 -0
- package/.code/agents/3bed368d-50fe-477e-aee3-a6707eaa1ab9/error.txt +3 -0
- package/.code/agents/3e40b925-db12-442f-8d7a-a25fc69a6672/error.txt +8 -0
- package/.code/agents/414d5776-cf58-41f3-9328-a6daed503a50/error.txt +5 -0
- package/.code/agents/42687751-4565-4610-b240-67835b17d861/error.txt +1 -0
- package/.code/agents/46b98876-1a39-43c9-9e2f-507ca6d47335/error.txt +9 -0
- package/.code/agents/4a7d9491-b26f-43dd-850d-2ecdc49b5d1b/error.txt +1 -0
- package/.code/agents/4e60f00a-1b3e-447f-87f3-7faf9deddec3/error.txt +13 -0
- package/.code/agents/5138fc1c-4d49-4b74-a7da-ccdb3a8e44e7/error.txt +14 -0
- package/.code/agents/521cff39-a7a3-42e5-a557-134f0f7daaa0/error.txt +5 -0
- package/.code/agents/53302dc5-3857-4413-9a47-9e0f64a51dc4/error.txt +5 -0
- package/.code/agents/567c7c2e-6a6f-4761-a08d-d36deeb2e0ac/error.txt +5 -0
- package/.code/agents/57b00845-80dc-47c9-953c-3028d16275d6/error.txt +3 -0
- package/.code/agents/593d9005-c2a5-48fd-8813-ece0d3f2de96/error.txt +1 -0
- package/.code/agents/5a112e66-0e1a-42f9-877c-53af56ea3551/error.txt +1 -0
- package/.code/agents/5b05e8ed-7788-4738-b7ee-9faa8180f992/error.txt +5 -0
- package/.code/agents/5f888d6f-d7ca-4ac8-be23-9ea1bf753951/error.txt +5 -0
- package/.code/agents/607db3ab-e4b0-435b-b497-93e9aa525549/error.txt +8 -0
- package/.code/agents/67dcb2a2-900f-4c78-b3fc-80b5213e0ddf/error.txt +8 -0
- package/.code/agents/69ad848c-4e98-49b3-b16c-0094ac2d1759/error.txt +5 -0
- package/.code/agents/6c9cfc5f-0d0b-445c-b121-9f60082c4f70/error.txt +1 -0
- package/.code/agents/6f6f8f77-4ab0-4f6e-9f30-40e8be0bd8f5/error.txt +1 -0
- package/.code/agents/72a7cde4-fa8a-4024-9038-27faa550539b/error.txt +1 -0
- package/.code/agents/7b48335c-8247-43aa-9949-5f820ba8e199/error.txt +1 -0
- package/.code/agents/80944249-bea9-4ac5-87de-a666c4df306e/error.txt +1 -0
- package/.code/agents/826099df-1b66-4186-a915-7eb59f9db19d/error.txt +5 -0
- package/.code/agents/8291d158-18a8-4a92-b799-4e9a4d9cce88/error.txt +1 -0
- package/.code/agents/82fb71a3-20fb-4341-804a-a2fc900f95bc/error.txt +1 -0
- package/.code/agents/855790ea-54ee-43e4-8209-a66994e37590/error.txt +1 -0
- package/.code/agents/88ce3a2e-04f2-42be-9062-bf97aa798da0/error.txt +3 -0
- package/.code/agents/9a17e398-b6ed-4218-bb55-bc64a8d38ce8/error.txt +8 -0
- package/.code/agents/9a4f4bfc-a2a6-4f40-a896-9335b41a7ed1/error.txt +1 -0
- package/.code/agents/9b633e55-ef84-47d6-94bb-fd3dd172ad97/error.txt +1 -0
- package/.code/agents/9b81f3ab-c72b-4a81-9a8f-28a49ddba84a/error.txt +8 -0
- package/.code/agents/a35daf29-b2d1-4aef-9b42-dad63a76bd47/error.txt +3 -0
- package/.code/agents/a81990cc-69ee-44d2-b907-17403c9bc5d7/error.txt +5 -0
- package/.code/agents/ab56260a-4a83-4ad4-9410-f88a23d6520a/error.txt +1 -0
- package/.code/agents/ad722c31-2d1d-45f7-bae2-3f02ca455b60/error.txt +1 -0
- package/.code/agents/b62e8690-3324-4b97-9309-731bee79416b/error.txt +5 -0
- package/.code/agents/baf60a3a-752b-4ad8-99d6-df32423ed2eb/error.txt +1 -0
- package/.code/agents/be049042-7dcb-4ac8-9beb-c8f1aea67742/error.txt +14 -0
- package/.code/agents/bed1dcb4-bfce-4a9f-8594-0f994962aafd/error.txt +1 -0
- package/.code/agents/c324a6cf-e935-4ede-9529-b3ebc18e8d6b/error.txt +5 -0
- package/.code/agents/c37c06ff-dfe3-43f2-9bbc-3ec73ec8f41d/error.txt +5 -0
- package/.code/agents/c8cd6671-433a-456b-9f88-e51cb2df6bfc/error.txt +11 -0
- package/.code/agents/ca2ccb67-2f24-428e-b27d-9365beadd140/error.txt +1 -0
- package/.code/agents/cf08c0c8-e7f0-423e-93ba-547e8e818340/error.txt +8 -0
- package/.code/agents/d579c74f-874b-40a4-9d56-ced1eb6a701d/error.txt +1 -0
- package/.code/agents/df412c98-7378-4deb-8e1e-76c416931181/error.txt +3 -0
- package/.code/agents/e5134eb3-2af4-45b0-8998-051cb4afdb45/error.txt +3 -0
- package/.code/agents/e6308471-aa45-4e9e-9496-2e9404164d97/error.txt +8 -0
- package/.code/agents/e7bd8bc7-23fb-4f46-98dc-b0dcf11b75a1/error.txt +1 -0
- package/.code/agents/e92bec35-378d-4fe1-8ac0-6e1bb3c86911/error.txt +5 -0
- package/.code/agents/ed918fbf-2dc4-4aa2-bfc5-04b65d9471ea/error.txt +1 -0
- package/.code/agents/ef1d756f-b272-48fc-8729-f05c494674f7/error.txt +1 -0
- package/.code/agents/ef359853-0249-4e41-a804-c0fc459fe456/error.txt +1 -0
- package/.code/agents/effc7b4a-4b90-40a0-8c86-a7a99d2d5fd2/error.txt +1 -0
- package/.code/agents/fa15f8d5-8359-4a8b-83a3-2f2056b3ff40/error.txt +3 -0
- package/.code/agents/fbef4193-eadf-4c8a-83ff-4878a6310f25/error.txt +8 -0
- package/.code/agents/fd0a4b4a-fda4-4964-a6d6-2b8a2da387c6/error.txt +1 -0
- package/.dxtignore +57 -0
- package/.env.example +44 -0
- package/.gemini/settings.json +8 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +41 -0
- package/.github/ISSUE_TEMPLATE/config.yml +5 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
- package/.github/ISSUE_TEMPLATE/release_checklist.md +31 -0
- package/.github/pull_request_template.md +41 -0
- package/.github/workflows/ci-tests.yml +41 -0
- package/.github/workflows/claude-code-review.yml +57 -0
- package/.github/workflows/claude.yml +50 -0
- package/.github/workflows/full-integration.yml +22 -0
- package/.github/workflows/pr-description-check.yml +88 -0
- package/.github/workflows/publish.yml +33 -0
- package/.github/workflows/release.yml +89 -0
- package/.mcpbignore +58 -0
- package/.prettierignore +10 -0
- package/.prettierrc.json +10 -0
- package/ADOS-2-Module-1-Complete-Manual.md +757 -0
- package/AGENTS.md +36 -0
- package/CHANGELOG.md +187 -0
- package/CLAUDE.md +414 -0
- package/CODEREVIEW_RESPONSE.md +128 -0
- package/LICENSE +17 -0
- package/NUL +1 -0
- package/README.md +222 -0
- package/SCHEMA_IMPROVEMENT_SUMMARY.md +120 -0
- package/TESTING_NOTES.md +217 -0
- package/WARP.md +245 -0
- package/accountactivity-merged.csv +149 -0
- package/bin/ynab-mcp-server.cjs +4 -0
- package/bin/ynab-mcp-server.js +8 -0
- package/bundle-analysis.html +13110 -0
- package/dist/bundle/index.cjs +124 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +85 -0
- package/dist/server/YNABMCPServer.d.ts +264 -0
- package/dist/server/YNABMCPServer.js +845 -0
- package/dist/server/budgetResolver.d.ts +15 -0
- package/dist/server/budgetResolver.js +99 -0
- package/dist/server/cacheManager.d.ts +74 -0
- package/dist/server/cacheManager.js +306 -0
- package/dist/server/config.d.ts +3 -0
- package/dist/server/config.js +19 -0
- package/dist/server/deltaCache.d.ts +61 -0
- package/dist/server/deltaCache.js +206 -0
- package/dist/server/deltaCache.merge.d.ts +9 -0
- package/dist/server/deltaCache.merge.js +111 -0
- package/dist/server/diagnostics.d.ts +90 -0
- package/dist/server/diagnostics.js +163 -0
- package/dist/server/errorHandler.d.ts +69 -0
- package/dist/server/errorHandler.js +524 -0
- package/dist/server/prompts.d.ts +31 -0
- package/dist/server/prompts.js +205 -0
- package/dist/server/rateLimiter.d.ts +27 -0
- package/dist/server/rateLimiter.js +82 -0
- package/dist/server/requestLogger.d.ts +62 -0
- package/dist/server/requestLogger.js +190 -0
- package/dist/server/resources.d.ts +39 -0
- package/dist/server/resources.js +85 -0
- package/dist/server/responseFormatter.d.ts +14 -0
- package/dist/server/responseFormatter.js +42 -0
- package/dist/server/securityMiddleware.d.ts +87 -0
- package/dist/server/securityMiddleware.js +117 -0
- package/dist/server/serverKnowledgeStore.d.ts +11 -0
- package/dist/server/serverKnowledgeStore.js +42 -0
- package/dist/server/toolRegistry.d.ts +85 -0
- package/dist/server/toolRegistry.js +272 -0
- package/dist/tools/__tests__/deltaTestUtils.d.ts +18 -0
- package/dist/tools/__tests__/deltaTestUtils.js +26 -0
- package/dist/tools/accountTools.d.ts +37 -0
- package/dist/tools/accountTools.js +175 -0
- package/dist/tools/budgetTools.d.ts +10 -0
- package/dist/tools/budgetTools.js +68 -0
- package/dist/tools/categoryTools.d.ts +27 -0
- package/dist/tools/categoryTools.js +232 -0
- package/dist/tools/compareTransactions/formatter.d.ts +71 -0
- package/dist/tools/compareTransactions/formatter.js +97 -0
- package/dist/tools/compareTransactions/index.d.ts +30 -0
- package/dist/tools/compareTransactions/index.js +160 -0
- package/dist/tools/compareTransactions/matcher.d.ts +12 -0
- package/dist/tools/compareTransactions/matcher.js +140 -0
- package/dist/tools/compareTransactions/parser.d.ts +14 -0
- package/dist/tools/compareTransactions/parser.js +430 -0
- package/dist/tools/compareTransactions/types.d.ts +27 -0
- package/dist/tools/compareTransactions/types.js +1 -0
- package/dist/tools/compareTransactions.d.ts +1 -0
- package/dist/tools/compareTransactions.js +1 -0
- package/dist/tools/deltaFetcher.d.ts +22 -0
- package/dist/tools/deltaFetcher.js +137 -0
- package/dist/tools/deltaSupport.d.ts +20 -0
- package/dist/tools/deltaSupport.js +176 -0
- package/dist/tools/exportTransactions.d.ts +17 -0
- package/dist/tools/exportTransactions.js +191 -0
- package/dist/tools/monthTools.d.ts +16 -0
- package/dist/tools/monthTools.js +107 -0
- package/dist/tools/payeeTools.d.ts +17 -0
- package/dist/tools/payeeTools.js +82 -0
- package/dist/tools/reconcileAdapter.d.ts +25 -0
- package/dist/tools/reconcileAdapter.js +167 -0
- package/dist/tools/reconciliation/analyzer.d.ts +3 -0
- package/dist/tools/reconciliation/analyzer.js +567 -0
- package/dist/tools/reconciliation/executor.d.ts +94 -0
- package/dist/tools/reconciliation/executor.js +611 -0
- package/dist/tools/reconciliation/index.d.ts +54 -0
- package/dist/tools/reconciliation/index.js +249 -0
- package/dist/tools/reconciliation/matcher.d.ts +3 -0
- package/dist/tools/reconciliation/matcher.js +160 -0
- package/dist/tools/reconciliation/payeeNormalizer.d.ts +6 -0
- package/dist/tools/reconciliation/payeeNormalizer.js +77 -0
- package/dist/tools/reconciliation/recommendationEngine.d.ts +2 -0
- package/dist/tools/reconciliation/recommendationEngine.js +273 -0
- package/dist/tools/reconciliation/reportFormatter.d.ts +13 -0
- package/dist/tools/reconciliation/reportFormatter.js +214 -0
- package/dist/tools/reconciliation/types.d.ts +172 -0
- package/dist/tools/reconciliation/types.js +7 -0
- package/dist/tools/schemas/outputs/accountOutputs.d.ts +58 -0
- package/dist/tools/schemas/outputs/accountOutputs.js +24 -0
- package/dist/tools/schemas/outputs/budgetOutputs.d.ts +48 -0
- package/dist/tools/schemas/outputs/budgetOutputs.js +15 -0
- package/dist/tools/schemas/outputs/categoryOutputs.d.ts +93 -0
- package/dist/tools/schemas/outputs/categoryOutputs.js +37 -0
- package/dist/tools/schemas/outputs/comparisonOutputs.d.ts +269 -0
- package/dist/tools/schemas/outputs/comparisonOutputs.js +181 -0
- package/dist/tools/schemas/outputs/index.d.ts +14 -0
- package/dist/tools/schemas/outputs/index.js +14 -0
- package/dist/tools/schemas/outputs/monthOutputs.d.ts +122 -0
- package/dist/tools/schemas/outputs/monthOutputs.js +51 -0
- package/dist/tools/schemas/outputs/payeeOutputs.d.ts +34 -0
- package/dist/tools/schemas/outputs/payeeOutputs.js +16 -0
- package/dist/tools/schemas/outputs/reconciliationOutputs.d.ts +1275 -0
- package/dist/tools/schemas/outputs/reconciliationOutputs.js +377 -0
- package/dist/tools/schemas/outputs/transactionMutationOutputs.d.ts +717 -0
- package/dist/tools/schemas/outputs/transactionMutationOutputs.js +260 -0
- package/dist/tools/schemas/outputs/transactionOutputs.d.ts +98 -0
- package/dist/tools/schemas/outputs/transactionOutputs.js +49 -0
- package/dist/tools/schemas/outputs/utilityOutputs.d.ts +219 -0
- package/dist/tools/schemas/outputs/utilityOutputs.js +120 -0
- package/dist/tools/schemas/shared/commonOutputs.d.ts +24 -0
- package/dist/tools/schemas/shared/commonOutputs.js +27 -0
- package/dist/tools/toolCategories.d.ts +32 -0
- package/dist/tools/toolCategories.js +32 -0
- package/dist/tools/transactionTools.d.ts +315 -0
- package/dist/tools/transactionTools.js +1722 -0
- package/dist/tools/utilityTools.d.ts +10 -0
- package/dist/tools/utilityTools.js +56 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.js +16 -0
- package/dist/types/toolAnnotations.d.ts +7 -0
- package/dist/types/toolAnnotations.js +1 -0
- package/dist/utils/amountUtils.d.ts +3 -0
- package/dist/utils/amountUtils.js +10 -0
- package/dist/utils/dateUtils.d.ts +9 -0
- package/dist/utils/dateUtils.js +43 -0
- package/dist/utils/money.d.ts +21 -0
- package/dist/utils/money.js +51 -0
- package/docs/README.md +72 -0
- package/docs/assets/examples/reconciliation-with-recommendations.json +68 -0
- package/docs/assets/schemas/reconciliation-v2.json +338 -0
- package/docs/getting-started/CONFIGURATION.md +175 -0
- package/docs/getting-started/INSTALLATION.md +333 -0
- package/docs/getting-started/QUICKSTART.md +282 -0
- package/docs/guides/ARCHITECTURE.md +650 -0
- package/docs/guides/DEPLOYMENT.md +189 -0
- package/docs/guides/INTEGRATION_TESTING.md +730 -0
- package/docs/guides/TESTING.md +591 -0
- package/docs/reconciliation-flow.md +83 -0
- package/docs/reference/API.md +1450 -0
- package/docs/reference/EXAMPLES.md +946 -0
- package/docs/reference/TOOLS.md +348 -0
- package/docs/reference/TROUBLESHOOTING.md +481 -0
- package/esbuild.config.mjs +68 -0
- package/eslint.config.js +49 -0
- package/fix-types.sh +17 -0
- package/meta.json +12550 -0
- package/package.json +105 -0
- package/package.json.tmp +105 -0
- package/scripts/analyze-bundle.mjs +41 -0
- package/scripts/create-pr-description.js +203 -0
- package/scripts/generate-mcpb.ps1 +96 -0
- package/scripts/run-domain-integration-tests.js +33 -0
- package/scripts/run-generate-mcpb.js +29 -0
- package/scripts/run-throttled-integration-tests.js +116 -0
- package/scripts/test-delta-params.mjs +140 -0
- package/scripts/test-recommendations.ts +53 -0
- package/scripts/tmpTransaction.ts +48 -0
- package/scripts/validate-env.js +122 -0
- package/scripts/verify-build.js +105 -0
- package/scripts/watch-and-restart.ps1 +50 -0
- package/src/__tests__/comprehensive.integration.test.ts +1196 -0
- package/src/__tests__/delta.performance.test.ts +80 -0
- package/src/__tests__/performance.test.ts +725 -0
- package/src/__tests__/setup.ts +449 -0
- package/src/__tests__/testRunner.ts +444 -0
- package/src/__tests__/testUtils.ts +563 -0
- package/src/__tests__/workflows.e2e.test.ts +1675 -0
- package/src/index.ts +124 -0
- package/src/server/.gitkeep +1 -0
- package/src/server/YNABMCPServer.ts +1188 -0
- package/src/server/__tests__/YNABMCPServer.integration.test.ts +903 -0
- package/src/server/__tests__/YNABMCPServer.test.ts +894 -0
- package/src/server/__tests__/budgetResolver.test.ts +425 -0
- package/src/server/__tests__/cacheManager.test.ts +880 -0
- package/src/server/__tests__/config.test.ts +166 -0
- package/src/server/__tests__/deltaCache.merge.test.ts +724 -0
- package/src/server/__tests__/deltaCache.swr.test.ts +168 -0
- package/src/server/__tests__/deltaCache.test.ts +774 -0
- package/src/server/__tests__/diagnostics.test.ts +823 -0
- package/src/server/__tests__/errorHandler.integration.test.ts +466 -0
- package/src/server/__tests__/errorHandler.test.ts +416 -0
- package/src/server/__tests__/prompts.test.ts +354 -0
- package/src/server/__tests__/rateLimiter.test.ts +314 -0
- package/src/server/__tests__/requestLogger.test.ts +408 -0
- package/src/server/__tests__/resources.test.ts +299 -0
- package/src/server/__tests__/security.integration.test.ts +426 -0
- package/src/server/__tests__/securityMiddleware.test.ts +449 -0
- package/src/server/__tests__/server-startup.integration.test.ts +477 -0
- package/src/server/__tests__/serverKnowledgeStore.test.ts +174 -0
- package/src/server/__tests__/toolRegistry.test.ts +855 -0
- package/src/server/budgetResolver.ts +235 -0
- package/src/server/cacheManager.ts +503 -0
- package/src/server/config.ts +41 -0
- package/src/server/deltaCache.merge.ts +149 -0
- package/src/server/deltaCache.ts +341 -0
- package/src/server/diagnostics.ts +338 -0
- package/src/server/errorHandler.ts +756 -0
- package/src/server/prompts.ts +291 -0
- package/src/server/rateLimiter.ts +156 -0
- package/src/server/requestLogger.ts +344 -0
- package/src/server/resources.ts +168 -0
- package/src/server/responseFormatter.ts +51 -0
- package/src/server/securityMiddleware.ts +236 -0
- package/src/server/serverKnowledgeStore.ts +91 -0
- package/src/server/toolRegistry.ts +489 -0
- package/src/tools/.gitkeep +1 -0
- package/src/tools/__tests__/accountTools.delta.integration.test.ts +128 -0
- package/src/tools/__tests__/accountTools.integration.test.ts +117 -0
- package/src/tools/__tests__/accountTools.test.ts +653 -0
- package/src/tools/__tests__/budgetTools.delta.integration.test.ts +90 -0
- package/src/tools/__tests__/budgetTools.integration.test.ts +134 -0
- package/src/tools/__tests__/budgetTools.test.ts +423 -0
- package/src/tools/__tests__/categoryTools.delta.integration.test.ts +80 -0
- package/src/tools/__tests__/categoryTools.integration.test.ts +295 -0
- package/src/tools/__tests__/categoryTools.test.ts +622 -0
- package/src/tools/__tests__/compareTransactions/formatter.test.ts +486 -0
- package/src/tools/__tests__/compareTransactions/index.test.ts +383 -0
- package/src/tools/__tests__/compareTransactions/matcher.test.ts +410 -0
- package/src/tools/__tests__/compareTransactions/parser.test.ts +764 -0
- package/src/tools/__tests__/compareTransactions.test.ts +342 -0
- package/src/tools/__tests__/compareTransactions.window.test.ts +147 -0
- package/src/tools/__tests__/deltaFetcher.scheduled.integration.test.ts +76 -0
- package/src/tools/__tests__/deltaFetcher.test.ts +270 -0
- package/src/tools/__tests__/deltaSupport.test.ts +188 -0
- package/src/tools/__tests__/deltaTestUtils.ts +46 -0
- package/src/tools/__tests__/exportTransactions.test.ts +213 -0
- package/src/tools/__tests__/monthTools.delta.integration.test.ts +80 -0
- package/src/tools/__tests__/monthTools.integration.test.ts +174 -0
- package/src/tools/__tests__/monthTools.test.ts +523 -0
- package/src/tools/__tests__/payeeTools.delta.integration.test.ts +80 -0
- package/src/tools/__tests__/payeeTools.integration.test.ts +150 -0
- package/src/tools/__tests__/payeeTools.test.ts +445 -0
- package/src/tools/__tests__/transactionTools.integration.test.ts +762 -0
- package/src/tools/__tests__/transactionTools.test.ts +3521 -0
- package/src/tools/__tests__/utilityTools.integration.test.ts +128 -0
- package/src/tools/__tests__/utilityTools.test.ts +205 -0
- package/src/tools/accountTools.ts +283 -0
- package/src/tools/budgetTools.ts +112 -0
- package/src/tools/categoryTools.ts +366 -0
- package/src/tools/compareTransactions/formatter.ts +163 -0
- package/src/tools/compareTransactions/index.ts +228 -0
- package/src/tools/compareTransactions/matcher.ts +240 -0
- package/src/tools/compareTransactions/parser.ts +557 -0
- package/src/tools/compareTransactions/types.ts +60 -0
- package/src/tools/compareTransactions.ts +3 -0
- package/src/tools/deltaFetcher.ts +278 -0
- package/src/tools/deltaSupport.ts +293 -0
- package/src/tools/exportTransactions.ts +273 -0
- package/src/tools/monthTools.ts +164 -0
- package/src/tools/payeeTools.ts +140 -0
- package/src/tools/reconcileAdapter.ts +312 -0
- package/src/tools/reconciliation/__tests__/adapter.causes.test.ts +122 -0
- package/src/tools/reconciliation/__tests__/adapter.test.ts +234 -0
- package/src/tools/reconciliation/__tests__/analyzer.test.ts +406 -0
- package/src/tools/reconciliation/__tests__/executor.integration.test.ts +366 -0
- package/src/tools/reconciliation/__tests__/executor.test.ts +779 -0
- package/src/tools/reconciliation/__tests__/matcher.test.ts +650 -0
- package/src/tools/reconciliation/__tests__/payeeNormalizer.test.ts +278 -0
- package/src/tools/reconciliation/__tests__/recommendationEngine.integration.test.ts +658 -0
- package/src/tools/reconciliation/__tests__/recommendationEngine.test.ts +1000 -0
- package/src/tools/reconciliation/__tests__/reconciliation.delta.integration.test.ts +151 -0
- package/src/tools/reconciliation/__tests__/reportFormatter.test.ts +573 -0
- package/src/tools/reconciliation/__tests__/scenarios/adapterCurrency.scenario.test.ts +78 -0
- package/src/tools/reconciliation/__tests__/scenarios/extremes.scenario.test.ts +47 -0
- package/src/tools/reconciliation/__tests__/scenarios/repeatAmount.scenario.test.ts +61 -0
- package/src/tools/reconciliation/__tests__/schemaUrl.test.ts +49 -0
- package/src/tools/reconciliation/analyzer.ts +824 -0
- package/src/tools/reconciliation/executor.ts +880 -0
- package/src/tools/reconciliation/index.ts +400 -0
- package/src/tools/reconciliation/matcher.ts +269 -0
- package/src/tools/reconciliation/payeeNormalizer.ts +167 -0
- package/src/tools/reconciliation/recommendationEngine.ts +506 -0
- package/src/tools/reconciliation/reportFormatter.ts +363 -0
- package/src/tools/reconciliation/types.ts +314 -0
- package/src/tools/schemas/outputs/__tests__/accountOutputs.test.ts +424 -0
- package/src/tools/schemas/outputs/__tests__/budgetOutputs.test.ts +310 -0
- package/src/tools/schemas/outputs/__tests__/categoryOutputs.test.ts +448 -0
- package/src/tools/schemas/outputs/__tests__/comparisonOutputs.test.ts +519 -0
- package/src/tools/schemas/outputs/__tests__/dateValidation.test.ts +155 -0
- package/src/tools/schemas/outputs/__tests__/discrepancyDirection.test.ts +288 -0
- package/src/tools/schemas/outputs/__tests__/monthOutputs.test.ts +478 -0
- package/src/tools/schemas/outputs/__tests__/payeeOutputs.test.ts +370 -0
- package/src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts +401 -0
- package/src/tools/schemas/outputs/__tests__/transactionMutationSchemas.test.ts +213 -0
- package/src/tools/schemas/outputs/__tests__/transactionOutputs.test.ts +474 -0
- package/src/tools/schemas/outputs/__tests__/utilityOutputs.test.ts +333 -0
- package/src/tools/schemas/outputs/accountOutputs.ts +137 -0
- package/src/tools/schemas/outputs/budgetOutputs.ts +86 -0
- package/src/tools/schemas/outputs/categoryOutputs.ts +194 -0
- package/src/tools/schemas/outputs/comparisonOutputs.ts +600 -0
- package/src/tools/schemas/outputs/index.ts +270 -0
- package/src/tools/schemas/outputs/monthOutputs.ts +243 -0
- package/src/tools/schemas/outputs/payeeOutputs.ts +105 -0
- package/src/tools/schemas/outputs/reconciliationOutputs.ts +796 -0
- package/src/tools/schemas/outputs/transactionMutationOutputs.ts +758 -0
- package/src/tools/schemas/outputs/transactionOutputs.ts +243 -0
- package/src/tools/schemas/outputs/utilityOutputs.ts +411 -0
- package/src/tools/schemas/shared/commonOutputs.ts +140 -0
- package/src/tools/toolCategories.ts +140 -0
- package/src/tools/transactionTools.ts +2509 -0
- package/src/tools/utilityTools.ts +90 -0
- package/src/types/.gitkeep +1 -0
- package/src/types/__tests__/index.test.ts +52 -0
- package/src/types/index.ts +67 -0
- package/src/types/integration-tests.d.ts +35 -0
- package/src/types/toolAnnotations.ts +44 -0
- package/src/utils/__tests__/dateUtils.test.ts +170 -0
- package/src/utils/__tests__/money.test.ts +189 -0
- package/src/utils/amountUtils.ts +32 -0
- package/src/utils/dateUtils.ts +108 -0
- package/src/utils/money.ts +123 -0
- package/test-csv-sample.csv +28 -0
- package/test-exports/sample_bank_statement.csv +7 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_09-04-53.json +23 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_1items_2025-11-19_10-37-42.json +23 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_4items_2025-11-19_09-02-09.json +44 -0
- package/test-exports/ynab_account_e9ddc2a6_minimal_6items_2025-11-19_10-37-52.json +58 -0
- package/test-exports/ynab_since_2025-11-01_account_4c18e9f0_minimal_14items_2025-11-16_10-07-10.json +115 -0
- package/test-reconcile-autodetect.js +40 -0
- package/test-reconcile-tool.js +152 -0
- package/test-reconcile-with-csv.cjs +89 -0
- package/test-statement.csv +8 -0
- package/test_debug.js +47 -0
- package/test_simple.mjs +16 -0
- package/tsconfig.json +31 -0
- package/tsconfig.prod.json +18 -0
- package/vitest-reporters/split-json-reporter.ts +211 -0
- package/vitest.config.ts +96 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Code Review Response: reconciliationOutputs.ts
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
CodeRabbit provided two suggestions for improving `src/tools/schemas/outputs/reconciliationOutputs.ts`. After technical analysis of the codebase, I've determined:
|
|
6
|
+
|
|
7
|
+
1. **Feedback #1 (ExecutionActionRecordSchema typing)**: Already implemented ✅
|
|
8
|
+
2. **Feedback #2 (discrepancy_direction validation)**: Not implementing - technically sound but violates architectural principles ❌
|
|
9
|
+
|
|
10
|
+
## Feedback #1: Stronger Typing for Transaction Field
|
|
11
|
+
|
|
12
|
+
**Suggestion:** Use discriminated unions instead of `z.record(z.string(), z.unknown())` for the transaction field in `ExecutionActionRecordSchema`.
|
|
13
|
+
|
|
14
|
+
**Status:** ✅ **Already Implemented**
|
|
15
|
+
|
|
16
|
+
### Analysis
|
|
17
|
+
|
|
18
|
+
The CodeRabbit feedback appears to be outdated. The current implementation (lines 431-479) already uses a discriminated union with strong typing:
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
export const ExecutionActionRecordSchema = z.discriminatedUnion('type', [
|
|
22
|
+
// Successful transaction creation
|
|
23
|
+
z.object({
|
|
24
|
+
type: z.literal('create_transaction'),
|
|
25
|
+
transaction: CreatedTransactionSchema.nullable(),
|
|
26
|
+
// ...
|
|
27
|
+
}),
|
|
28
|
+
// Failed transaction creation
|
|
29
|
+
z.object({
|
|
30
|
+
type: z.literal('create_transaction_failed'),
|
|
31
|
+
transaction: TransactionCreationPayloadSchema,
|
|
32
|
+
// ...
|
|
33
|
+
}),
|
|
34
|
+
// ... other action types
|
|
35
|
+
]);
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Each action type has its own specific schema:
|
|
39
|
+
|
|
40
|
+
- `CreatedTransactionSchema` - for successful creations (line 371)
|
|
41
|
+
- `TransactionCreationPayloadSchema` - for failed/dry-run creations (line 387)
|
|
42
|
+
- `TransactionUpdatePayloadSchema` - for status/date changes (line 402)
|
|
43
|
+
- `DuplicateDetectionPayloadSchema` - for duplicate detection (line 412)
|
|
44
|
+
|
|
45
|
+
This provides full type safety without the drawbacks of loose typing.
|
|
46
|
+
|
|
47
|
+
## Feedback #2: Validate discrepancy_direction Against Actual Discrepancy
|
|
48
|
+
|
|
49
|
+
**Suggestion:** Add a Zod refinement to ensure `discrepancy_direction` matches the sign of `balance.discrepancy.amount`.
|
|
50
|
+
|
|
51
|
+
**Status:** ❌ **Not Implementing**
|
|
52
|
+
|
|
53
|
+
### Analysis
|
|
54
|
+
|
|
55
|
+
While technically correct, this validation violates architectural principles and provides minimal benefit:
|
|
56
|
+
|
|
57
|
+
#### Current Implementation (reconcileAdapter.ts:122-135)
|
|
58
|
+
|
|
59
|
+
The `convertBalanceInfo` function deterministically derives `discrepancy_direction` from `discrepancyMilli`:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const convertBalanceInfo = (analysis: ReconciliationAnalysis) => {
|
|
63
|
+
const discrepancyMilli = analysis.balance_info.discrepancy.value_milliunits;
|
|
64
|
+
const direction =
|
|
65
|
+
discrepancyMilli === 0 ? 'balanced' : discrepancyMilli > 0 ? 'ynab_higher' : 'bank_higher';
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
current_cleared: analysis.balance_info.current_cleared,
|
|
69
|
+
// ...
|
|
70
|
+
discrepancy: analysis.balance_info.discrepancy,
|
|
71
|
+
discrepancy_direction: direction,
|
|
72
|
+
on_track: analysis.balance_info.on_track,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
This logic is:
|
|
78
|
+
|
|
79
|
+
- **Simple and obvious**: Direct mapping from sign to direction
|
|
80
|
+
- **Well-tested**: Part of the adapter layer
|
|
81
|
+
- **Single point of truth**: Consistency enforced at construction time
|
|
82
|
+
|
|
83
|
+
#### Why Not Add Schema Validation?
|
|
84
|
+
|
|
85
|
+
1. **Violates Single Responsibility Principle**
|
|
86
|
+
The schema's job is to validate structure, not business logic consistency. The adapter already enforces this invariant at construction time.
|
|
87
|
+
|
|
88
|
+
2. **Adds Runtime Overhead**
|
|
89
|
+
Schema validation runs on every payload validation. This adds unnecessary computation for a condition that should never occur if the adapter works correctly.
|
|
90
|
+
|
|
91
|
+
3. **Couples Schema to Business Logic**
|
|
92
|
+
The schema would need to know the thresholds and logic for determining direction. This creates tight coupling between layers that should be independent.
|
|
93
|
+
|
|
94
|
+
4. **Limited Bug Detection Value**
|
|
95
|
+
If the adapter logic is broken, we'd want to fix the adapter, not catch it at validation time. Schema validation wouldn't prevent the bug, just detect it later in the pipeline.
|
|
96
|
+
|
|
97
|
+
5. **Test Coverage Sufficient**
|
|
98
|
+
The adapter has comprehensive test coverage. Adding redundant validation at the schema level doesn't improve reliability.
|
|
99
|
+
|
|
100
|
+
### Alternative Considered
|
|
101
|
+
|
|
102
|
+
If we were truly concerned about this invariant, the better approach would be:
|
|
103
|
+
|
|
104
|
+
1. Add unit tests specifically for the `convertBalanceInfo` function
|
|
105
|
+
2. Add integration tests that verify the full payload structure
|
|
106
|
+
3. Add a comment in the schema documenting the expected relationship
|
|
107
|
+
|
|
108
|
+
But given the simplicity of the current implementation and existing test coverage, none of these are necessary.
|
|
109
|
+
|
|
110
|
+
### Recommendation
|
|
111
|
+
|
|
112
|
+
**Accept Feedback #1 as already implemented.**
|
|
113
|
+
**Respectfully decline Feedback #2** - the adapter already enforces consistency, and adding schema-level validation would violate architectural principles without meaningful benefit.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Files Changed
|
|
118
|
+
|
|
119
|
+
- `src/tools/schemas/outputs/reconciliationOutputs.ts` - No changes required (already has strong typing)
|
|
120
|
+
- `CODEREVIEW_RESPONSE.md` - This document
|
|
121
|
+
|
|
122
|
+
## Tests
|
|
123
|
+
|
|
124
|
+
All existing tests pass:
|
|
125
|
+
|
|
126
|
+
- ✅ `npm run type-check` - TypeScript compilation successful
|
|
127
|
+
- ✅ `npm run test:unit -- reconciliationOutputs` - 26/26 tests passing
|
|
128
|
+
- ✅ No regressions in related tests
|
package/LICENSE
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
GNU Affero General Public License v3.0 (AGPL-3.0)
|
|
2
|
+
|
|
3
|
+
SPDX-License-Identifier: AGPL-3.0-only
|
|
4
|
+
|
|
5
|
+
This project is licensed under the terms of the GNU Affero General Public License
|
|
6
|
+
version 3. The full license text is available at:
|
|
7
|
+
|
|
8
|
+
https://www.gnu.org/licenses/agpl-3.0.txt
|
|
9
|
+
|
|
10
|
+
You should have received a copy of the GNU Affero General Public License along with
|
|
11
|
+
this program. If not, see the URL above.
|
|
12
|
+
|
|
13
|
+
Note: For convenience and to avoid repository bloat, this repository references the
|
|
14
|
+
canonical license text hosted by the Free Software Foundation. If your distribution
|
|
15
|
+
process requires bundling the full license text, include the contents of the URL
|
|
16
|
+
above alongside this file.
|
|
17
|
+
|
package/NUL
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ls: cannot access 'dist/*.dxt': No such file or directory
|
package/README.md
ADDED
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# YNAB MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://github.com/dizzlkheinz/ynab-mcpb/releases/latest)
|
|
4
|
+
[](https://www.npmjs.com/package/@dizzlkheinz/ynab-mcp-server)
|
|
5
|
+
[](https://www.npmjs.com/package/@dizzlkheinz/ynab-mcp-server)
|
|
6
|
+
|
|
7
|
+
[](https://github.com/dizzlkheinz/ynab-mcpb/releases/latest)
|
|
8
|
+
[](https://github.com/dizzlkheinz/ynab-mcpb/actions/workflows/release.yml)
|
|
9
|
+
[](https://github.com/dizzlkheinz/ynab-mcpb/releases)
|
|
10
|
+
[](LICENSE)
|
|
11
|
+
[](https://prettier.io)
|
|
12
|
+
[](https://eslint.org)
|
|
13
|
+
[](#)
|
|
14
|
+
[](https://www.typescriptlang.org)
|
|
15
|
+
[](https://semver.org/)
|
|
16
|
+
[](https://github.com/dizzlkheinz/ynab-mcpb/issues)
|
|
17
|
+
[](https://github.com/dizzlkheinz/ynab-mcpb/pulls)
|
|
18
|
+
|
|
19
|
+
Connect your YNAB budget to Claude Desktop and other AI assistants using the Model Context Protocol (MCP). Ask questions about your spending, create transactions, reconcile accounts, and manage your budget using natural language.
|
|
20
|
+
|
|
21
|
+
## What Can You Do?
|
|
22
|
+
|
|
23
|
+
- **Ask Questions**: "How much did I spend on groceries last month?" or "What's my credit card balance?"
|
|
24
|
+
- **Manage Transactions**: Create, update, or delete transactions without opening YNAB
|
|
25
|
+
- **Split Receipts**: Create itemized transactions from receipts with automatic tax allocation across items
|
|
26
|
+
- **Reconcile Accounts**: Import and compare bank statements to find missing transactions
|
|
27
|
+
- **Analyze Spending**: Get insights into spending patterns and budget performance
|
|
28
|
+
- **Set Budgets**: Adjust category budgets and move money between categories
|
|
29
|
+
|
|
30
|
+
All monetary amounts are automatically converted to dollars (YNAB stores them in milliunits internally), so everything is human-readable.
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
### Step 1: Get Your YNAB Access Token
|
|
35
|
+
|
|
36
|
+
1. Log in to [YNAB Web App](https://app.youneedabudget.com)
|
|
37
|
+
2. Go to **Account Settings** → **Developer Settings**
|
|
38
|
+
3. Click **New Token**
|
|
39
|
+
4. Give it a name (e.g., "MCP Server")
|
|
40
|
+
5. Copy the token (you'll only see it once!)
|
|
41
|
+
|
|
42
|
+
### Step 2: Install in Your MCP Client
|
|
43
|
+
|
|
44
|
+
<details>
|
|
45
|
+
<summary><b>Claude Desktop</b> (Recommended)</summary>
|
|
46
|
+
|
|
47
|
+
#### Option A: Download the Extension
|
|
48
|
+
|
|
49
|
+
1. Download the latest `.mcpb` file from [Releases](https://github.com/dizzlkheinz/ynab-mcpb/releases/latest)
|
|
50
|
+
2. Drag and drop it into Claude Desktop
|
|
51
|
+
3. Paste your YNAB Access Token when prompted
|
|
52
|
+
4. Restart Claude Desktop
|
|
53
|
+
|
|
54
|
+
#### Option B: Use npx
|
|
55
|
+
|
|
56
|
+
Add this to your Claude Desktop MCP settings file:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"mcpServers": {
|
|
61
|
+
"ynab": {
|
|
62
|
+
"command": "npx",
|
|
63
|
+
"args": ["-y", "@dizzlkheinz/ynab-mcp-server"],
|
|
64
|
+
"env": {
|
|
65
|
+
"YNAB_ACCESS_TOKEN": "your-token-here"
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
</details>
|
|
73
|
+
|
|
74
|
+
<details>
|
|
75
|
+
<summary><b>Cline (VS Code Extension)</b></summary>
|
|
76
|
+
|
|
77
|
+
Add this to your Cline MCP settings:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"mcpServers": {
|
|
82
|
+
"ynab": {
|
|
83
|
+
"command": "npx",
|
|
84
|
+
"args": ["-y", "@dizzlkheinz/ynab-mcp-server"],
|
|
85
|
+
"env": {
|
|
86
|
+
"YNAB_ACCESS_TOKEN": "your-token-here"
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
</details>
|
|
94
|
+
|
|
95
|
+
<details>
|
|
96
|
+
<summary><b>Other MCP Clients</b></summary>
|
|
97
|
+
|
|
98
|
+
For any MCP-compatible client, configure the server with:
|
|
99
|
+
|
|
100
|
+
**Command:** `npx`
|
|
101
|
+
**Arguments:** `["-y", "@dizzlkheinz/ynab-mcp-server"]`
|
|
102
|
+
**Environment Variables:**
|
|
103
|
+
|
|
104
|
+
- `YNAB_ACCESS_TOKEN`: Your YNAB Personal Access Token
|
|
105
|
+
|
|
106
|
+
Refer to your MCP client's documentation for specific configuration steps.
|
|
107
|
+
|
|
108
|
+
</details>
|
|
109
|
+
|
|
110
|
+
### Step 3: Start Using It
|
|
111
|
+
|
|
112
|
+
Ask your AI assistant questions like:
|
|
113
|
+
|
|
114
|
+
- "What's my checking account balance?"
|
|
115
|
+
- "How much have I spent on dining out this month?"
|
|
116
|
+
- "List my recent transactions"
|
|
117
|
+
- "Set my groceries budget to $500"
|
|
118
|
+
|
|
119
|
+
That's it! You're ready to manage your budget with AI.
|
|
120
|
+
|
|
121
|
+
## Optional Configuration
|
|
122
|
+
|
|
123
|
+
Most users won't need to change these settings, but they're available if you need them:
|
|
124
|
+
|
|
125
|
+
**Export Location:**
|
|
126
|
+
|
|
127
|
+
- `YNAB_EXPORT_PATH` — Where to save exported transaction files (defaults to Downloads folder)
|
|
128
|
+
|
|
129
|
+
Example:
|
|
130
|
+
|
|
131
|
+
```json
|
|
132
|
+
{
|
|
133
|
+
"mcpServers": {
|
|
134
|
+
"ynab": {
|
|
135
|
+
"command": "npx",
|
|
136
|
+
"args": ["-y", "@dizzlkheinz/ynab-mcp-server"],
|
|
137
|
+
"env": {
|
|
138
|
+
"YNAB_ACCESS_TOKEN": "your-token-here",
|
|
139
|
+
"YNAB_EXPORT_PATH": "C:\\Users\\YourName\\Documents"
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
For advanced configuration options (caching, output formatting), see the [Configuration Guide](docs/getting-started/CONFIGURATION.md).
|
|
147
|
+
|
|
148
|
+
## What's Available
|
|
149
|
+
|
|
150
|
+
The server gives Claude access to 30 tools organized by function. You don't need to know the tool names - just ask Claude in natural language and it will use the right tools.
|
|
151
|
+
|
|
152
|
+
**Budget & Account Info**
|
|
153
|
+
|
|
154
|
+
- View budgets, accounts, categories, payees
|
|
155
|
+
- Check balances and category budgets
|
|
156
|
+
- See monthly spending summaries
|
|
157
|
+
|
|
158
|
+
**Transactions**
|
|
159
|
+
|
|
160
|
+
- List, create, update, or delete transactions
|
|
161
|
+
- Import and reconcile bank statements
|
|
162
|
+
- Export transactions to files
|
|
163
|
+
- Create split transactions from receipts
|
|
164
|
+
|
|
165
|
+
**Analysis**
|
|
166
|
+
|
|
167
|
+
- Compare spending across time periods
|
|
168
|
+
- Find missing transactions
|
|
169
|
+
- Track budget performance
|
|
170
|
+
|
|
171
|
+
For the complete list with technical details, see the [API Reference](docs/reference/API.md).
|
|
172
|
+
|
|
173
|
+
## Need Help?
|
|
174
|
+
|
|
175
|
+
- **[Troubleshooting Guide](docs/reference/TROUBLESHOOTING.md)** - Common issues and solutions
|
|
176
|
+
- **[Full Documentation](docs/README.md)** - Complete guides and API reference
|
|
177
|
+
- **[GitHub Issues](https://github.com/dizzlkheinz/ynab-mcpb/issues)** - Report bugs or request features
|
|
178
|
+
|
|
179
|
+
## For Developers
|
|
180
|
+
|
|
181
|
+
Want to contribute or build from source?
|
|
182
|
+
|
|
183
|
+
- **[Development Guide](docs/guides/DEVELOPMENT.md)** - Setup and best practices
|
|
184
|
+
- **[Architecture Overview](docs/guides/ARCHITECTURE.md)** - How the code is organized
|
|
185
|
+
- **[Testing Guide](docs/guides/TESTING.md)** - Running and writing tests
|
|
186
|
+
|
|
187
|
+
Quick start for development:
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
git clone <repository-url>
|
|
191
|
+
cd ynab-mcp-server
|
|
192
|
+
npm install
|
|
193
|
+
npm run build
|
|
194
|
+
npm test
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## Security & Privacy
|
|
198
|
+
|
|
199
|
+
Your YNAB access token is stored securely and never logged. All communication with YNAB's API uses HTTPS, and the server validates all inputs to prevent errors and security issues.
|
|
200
|
+
|
|
201
|
+
## Contributing
|
|
202
|
+
|
|
203
|
+
Contributions welcome! Please:
|
|
204
|
+
|
|
205
|
+
1. [Open an issue](https://github.com/dizzlkheinz/ynab-mcpb/issues) to discuss your idea
|
|
206
|
+
2. Fork the repository and make your changes
|
|
207
|
+
3. Add tests for new features
|
|
208
|
+
4. Submit a pull request
|
|
209
|
+
|
|
210
|
+
See the [Development Guide](docs/guides/DEVELOPMENT.md) for details.
|
|
211
|
+
|
|
212
|
+
## License
|
|
213
|
+
|
|
214
|
+
Licensed under [AGPL-3.0](LICENSE). Free to use and modify, but derivative works must also be open source.
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
Built with:
|
|
219
|
+
|
|
220
|
+
- [YNAB API](https://api.youneedabudget.com/) - Official YNAB REST API
|
|
221
|
+
- [Model Context Protocol](https://modelcontextprotocol.io/) - AI integration standard
|
|
222
|
+
- [Claude Desktop](https://claude.ai/download) - AI assistant with MCP support
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# ExecutionActionRecord Schema Type Safety Improvements
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Addressed CodeRabbit's feedback about weak typing in `ExecutionActionRecordSchema` by replacing the generic `z.record(z.string(), z.unknown())` transaction field with a discriminated union based on action type.
|
|
6
|
+
|
|
7
|
+
## Problem
|
|
8
|
+
|
|
9
|
+
The original schema at line 370 in `reconciliationOutputs.ts` used:
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
export const ExecutionActionRecordSchema = z.object({
|
|
13
|
+
type: z.string(),
|
|
14
|
+
transaction: z.record(z.string(), z.unknown()).nullable(),
|
|
15
|
+
// ...
|
|
16
|
+
});
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This provided no type safety for transaction data, making the code prone to runtime errors if assumptions about transaction structure were incorrect.
|
|
20
|
+
|
|
21
|
+
## Solution
|
|
22
|
+
|
|
23
|
+
Implemented a **discriminated union** based on the `type` field, with each action type having its own strongly-typed transaction schema:
|
|
24
|
+
|
|
25
|
+
### Action Types & Transaction Schemas
|
|
26
|
+
|
|
27
|
+
1. **`create_transaction`** - Successful transaction creation
|
|
28
|
+
- Transaction: `CreatedTransactionSchema.nullable()`
|
|
29
|
+
- Full YNAB API transaction response with `.passthrough()` for additional fields
|
|
30
|
+
- Optional fields: `bulk_chunk_index`, `correlation_key`
|
|
31
|
+
|
|
32
|
+
2. **`create_transaction_failed`** - Failed transaction creation
|
|
33
|
+
- Transaction: `TransactionCreationPayloadSchema` (required)
|
|
34
|
+
- The request payload that failed to create
|
|
35
|
+
- Optional fields: `bulk_chunk_index`, `correlation_key`
|
|
36
|
+
|
|
37
|
+
3. **`create_transaction_duplicate`** - Duplicate detection
|
|
38
|
+
- Transaction: `DuplicateDetectionPayloadSchema` (required)
|
|
39
|
+
- Contains `transaction_id` (nullable) and optional `import_id`
|
|
40
|
+
- Required fields: `bulk_chunk_index`, `duplicate: true`
|
|
41
|
+
- Optional: `correlation_key`
|
|
42
|
+
|
|
43
|
+
4. **`update_transaction`** - Transaction update (status/date)
|
|
44
|
+
- Transaction: Union of `CreatedTransactionSchema.nullable()` (real execution) or `TransactionUpdatePayloadSchema` (dry run)
|
|
45
|
+
- Handles both full transaction responses and minimal update payloads
|
|
46
|
+
|
|
47
|
+
5. **`balance_checkpoint`** - Balance alignment checkpoint
|
|
48
|
+
- Transaction: `z.null()` (always null)
|
|
49
|
+
- No optional fields
|
|
50
|
+
|
|
51
|
+
6. **`bulk_create_fallback`** - Bulk operation fallback to sequential
|
|
52
|
+
- Transaction: `z.null()` (always null)
|
|
53
|
+
- Required: `bulk_chunk_index`
|
|
54
|
+
|
|
55
|
+
### Helper Schemas
|
|
56
|
+
|
|
57
|
+
**`CreatedTransactionSchema`**
|
|
58
|
+
|
|
59
|
+
- Validates YNAB API transaction responses
|
|
60
|
+
- Uses `.passthrough()` to allow additional API fields
|
|
61
|
+
- Required: `id`, `date`, `amount`
|
|
62
|
+
- Optional: `memo`, `cleared`, `approved`, `payee_name`, `category_name`, `import_id`
|
|
63
|
+
|
|
64
|
+
**`TransactionCreationPayloadSchema`**
|
|
65
|
+
|
|
66
|
+
- Validates transaction creation requests
|
|
67
|
+
- Required: `account_id`, `date`, `amount`
|
|
68
|
+
- Optional: `payee_name`, `memo`, `cleared`, `approved`, `import_id`
|
|
69
|
+
|
|
70
|
+
**`TransactionUpdatePayloadSchema`**
|
|
71
|
+
|
|
72
|
+
- Validates transaction update requests
|
|
73
|
+
- Required: `transaction_id`
|
|
74
|
+
- Optional: `new_date`, `cleared`
|
|
75
|
+
|
|
76
|
+
**`DuplicateDetectionPayloadSchema`**
|
|
77
|
+
|
|
78
|
+
- Validates duplicate detection metadata
|
|
79
|
+
- Required: `transaction_id` (nullable)
|
|
80
|
+
- Optional: `import_id`
|
|
81
|
+
|
|
82
|
+
## Benefits
|
|
83
|
+
|
|
84
|
+
1. **Type Safety** - Compile-time checking of transaction field structure
|
|
85
|
+
2. **Self-Documenting** - Schema clearly shows what data each action type contains
|
|
86
|
+
3. **Runtime Validation** - Zod catches malformed data before it causes issues
|
|
87
|
+
4. **Better Errors** - Discriminated union provides clear validation error messages
|
|
88
|
+
5. **Flexibility** - `.passthrough()` on `CreatedTransactionSchema` allows future YNAB API additions
|
|
89
|
+
6. **Zero Breaking Changes** - Backward compatible, all existing data validates correctly
|
|
90
|
+
|
|
91
|
+
## Testing
|
|
92
|
+
|
|
93
|
+
Created comprehensive test suite (`reconciliationOutputs.test.ts`) with 26 passing tests covering:
|
|
94
|
+
|
|
95
|
+
- All 6 action types with valid data
|
|
96
|
+
- Negative cases (wrong types, missing required fields)
|
|
97
|
+
- Discriminated union behavior (unknown types, type mismatches)
|
|
98
|
+
- Helper schema validation
|
|
99
|
+
- Edge cases (null transactions, passthrough fields)
|
|
100
|
+
|
|
101
|
+
## Files Changed
|
|
102
|
+
|
|
103
|
+
1. `src/tools/schemas/outputs/reconciliationOutputs.ts` - Schema definitions
|
|
104
|
+
2. `src/tools/schemas/outputs/__tests__/reconciliationOutputs.test.ts` - New test suite
|
|
105
|
+
|
|
106
|
+
## Verification
|
|
107
|
+
|
|
108
|
+
- ✅ TypeScript compilation passes (`npm run type-check`)
|
|
109
|
+
- ✅ All 26 new schema tests pass
|
|
110
|
+
- ✅ Build succeeds (`npm run build`)
|
|
111
|
+
- ✅ MCPB package generation succeeds
|
|
112
|
+
- ✅ No runtime changes to executor.ts needed (schemas match actual usage)
|
|
113
|
+
|
|
114
|
+
## Implementation Notes
|
|
115
|
+
|
|
116
|
+
The discriminated union matches exactly how the executor currently constructs action records (verified by analyzing `src/tools/reconciliation/executor.ts` lines 226-580). No changes to runtime code were needed, proving this is a pure type-safety enhancement.
|
|
117
|
+
|
|
118
|
+
## Follow-up Opportunities
|
|
119
|
+
|
|
120
|
+
Consider applying the same pattern to other schemas with generic `z.record()` fields if similar type safety concerns exist elsewhere in the codebase.
|