@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
package/AGENTS.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Repository Guidelines
|
|
2
|
+
|
|
3
|
+
## Project Structure & Module Organization
|
|
4
|
+
|
|
5
|
+
`src/` hosts all TypeScript modules: `server/` wires the MCP host, `tools/` defines tool handlers, `utils/` shares primitives, and `index.ts` is the entry point.
|
|
6
|
+
Tests live in `src/__tests__` (unit, integration, e2e, performance) with sanitized fixtures in `test-exports/` and artifacts in `test-results/`.
|
|
7
|
+
Documentation stays in `docs/`, automation in `scripts/`, and compiled output in `dist/` plus `dist/bundle/`; never edit generated files directly.
|
|
8
|
+
|
|
9
|
+
## Build, Test, and Development Commands
|
|
10
|
+
|
|
11
|
+
- `npm run dev` - incremental TypeScript build while coding.
|
|
12
|
+
- `npm run build` - clean `dist/`, compile, then esbuild-bundle.
|
|
13
|
+
- `npm run build:prod` / `npm run package:mcpb` - production bundle with verification and MCPB packing.
|
|
14
|
+
- `npm start` or `npm run start:mcp` - launch compiled server with `.env`.
|
|
15
|
+
- `npm run validate-env` - confirm required secrets before tool runs.
|
|
16
|
+
|
|
17
|
+
## Coding Style & Naming Conventions
|
|
18
|
+
|
|
19
|
+
Prettier enforces 2-space indent, 100-char width, single quotes, and semicolons; verify with `npm run format:check`.
|
|
20
|
+
ESLint (`npm run lint`) must pass before commits; prefer `npm run lint:fix` for safe rewrites.
|
|
21
|
+
Name files after their capability (`budgetService.ts`, `create-account.tool.ts`) and keep MCP tool identifiers kebab-case with ES modules and explicit dependency injection.
|
|
22
|
+
|
|
23
|
+
## Testing Guidelines
|
|
24
|
+
|
|
25
|
+
Vitest powers the suite: `npm test` runs everything then filters failures into `test-results.json`, while `test:unit`, `test:integration`, `test:e2e`, `test:performance`, and `test:coverage` target specific goals.
|
|
26
|
+
Use `test:comprehensive` (tsx runner) for orchestration flows, mirror test filenames to the feature, and update fixtures only with scrubbed data.
|
|
27
|
+
|
|
28
|
+
## Commit & Pull Request Guidelines
|
|
29
|
+
|
|
30
|
+
History follows Conventional Commits (`docs:`, `fix:`, `refactor:`); keep patches focused and note verification commands in every PR.
|
|
31
|
+
Run `npm run pr:description` to refresh `.pr-description.md` before `gh pr create`, link issues, and attach screenshots or sample JSON for user-facing changes.
|
|
32
|
+
|
|
33
|
+
## Environment & Security Tips
|
|
34
|
+
|
|
35
|
+
Clone `.env` from `.env.example`, set `YNAB_ACCESS_TOKEN` plus cache settings, then rerun `npm run validate-env` after edits.
|
|
36
|
+
Avoid logging secrets, prefer sample budgets when demonstrating behaviors, and delete stray exports from `test-exports/` before pushing.
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **Default Build to Production** - All builds now use minified production bundle
|
|
13
|
+
- `npm run build` now aliases `build:prod` (was dev build)
|
|
14
|
+
- `prepare` hook uses production build for consistent npm distribution
|
|
15
|
+
- Bundle size reduced from 2.35 MB → 1.28 MB (~45% smaller)
|
|
16
|
+
- Use `npm run build:dev` if you need sourcemaps for debugging
|
|
17
|
+
- **Integrated Linting and Formatting** - Code quality checks now run automatically
|
|
18
|
+
- `npm run lint` now runs both ESLint and Prettier checks
|
|
19
|
+
- `npm run lint:fix` now fixes both ESLint issues and formats with Prettier
|
|
20
|
+
- `npm run build` automatically fixes code quality and formatting issues before building
|
|
21
|
+
- `console.log` statements now allowed in test files for debugging
|
|
22
|
+
- Use `npm run build:no-lint` to skip linting during rapid iteration
|
|
23
|
+
- **Reconciliation Default Tolerance** - Increased `date_tolerance_days` default from 2 to 5 days
|
|
24
|
+
- Better handles typical credit card processing delays (3-5 days)
|
|
25
|
+
- Matches `compare_transactions` default for consistency
|
|
26
|
+
- Still configurable per-call for tighter matching when needed
|
|
27
|
+
|
|
28
|
+
### Fixed
|
|
29
|
+
|
|
30
|
+
- **Month Output Schema** - `age_of_money` now correctly accepts `null` values
|
|
31
|
+
- YNAB API returns `null` when insufficient transaction history exists
|
|
32
|
+
- Changed from `z.number().optional()` to `z.number().nullish()`
|
|
33
|
+
- Affects both `MonthDetailSchema` and `MonthSummarySchema`
|
|
34
|
+
|
|
35
|
+
## [0.12.0] - 2025-11-19
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- **Structured Output Schemas** - Zod-based output validation for all 30 tools
|
|
40
|
+
- Output schemas in `src/tools/schemas/outputs/` with centralized exports
|
|
41
|
+
- Automatic validation in ToolRegistry (toolRegistry.ts:401-483) using `z.safeParse()`
|
|
42
|
+
- Type-safe responses with TypeScript inference
|
|
43
|
+
- **Unit Tests** - Full coverage for output schemas (7 test files)
|
|
44
|
+
- Budget, account, transaction, category, payee, month outputs
|
|
45
|
+
- Comparison and export schemas with specialized validations
|
|
46
|
+
- **E2E Schema Validation**
|
|
47
|
+
- `validateOutputSchema()` helper in testUtils.ts
|
|
48
|
+
- Schema validation integrated into workflow tests
|
|
49
|
+
|
|
50
|
+
### Changed
|
|
51
|
+
|
|
52
|
+
- ToolRegistry validates handler responses against output schemas
|
|
53
|
+
- `listTools()` includes `outputSchema` field in Tool objects
|
|
54
|
+
- TOOLS.md updated with structured output documentation
|
|
55
|
+
|
|
56
|
+
## [0.11.0] - 2025-01-14
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **Tiered Integration Testing** - Three-tier test system
|
|
61
|
+
- Core: Budget-agnostic fundamental operations
|
|
62
|
+
- Domain: Budget-specific tests by functional domain
|
|
63
|
+
- Throttled execution respecting API rate limits
|
|
64
|
+
- **Delta Request System** - Incremental data fetching via YNAB delta protocol
|
|
65
|
+
- `ServerKnowledgeStore`: Tracks server knowledge for delta endpoints
|
|
66
|
+
- `DeltaCache`: Specialized caching with conflict detection
|
|
67
|
+
- `DeltaFetcher`: Unified interface for delta-backed API calls
|
|
68
|
+
- 70-90% reduction in API response size for cached data
|
|
69
|
+
- **Bulk Transaction Operations** - Batch handling for up to 100 transactions
|
|
70
|
+
- `create_transactions`: Batch create with duplicate detection via import_id
|
|
71
|
+
- `update_transactions`: Batch update with automatic cache invalidation
|
|
72
|
+
- Dry-run mode and correlation metadata
|
|
73
|
+
- **Enhanced Transaction Metadata**
|
|
74
|
+
- Optional `original_account_id` and `original_date` for cache invalidation
|
|
75
|
+
- Preview functionality for updates
|
|
76
|
+
- Response size management for large batches
|
|
77
|
+
|
|
78
|
+
### Changed
|
|
79
|
+
|
|
80
|
+
- Tool count: 28 → 30
|
|
81
|
+
- Delta-backed tools use `DeltaFetcher` for cache optimization
|
|
82
|
+
- Write operations support `DeltaCache` and `ServerKnowledgeStore`
|
|
83
|
+
|
|
84
|
+
### Fixed
|
|
85
|
+
|
|
86
|
+
- Cache invalidation for cross-account transaction updates
|
|
87
|
+
- Response size management for bulk operations
|
|
88
|
+
|
|
89
|
+
## [0.10.0] - 2025-11-03
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
|
|
93
|
+
- **Reconciliation v2** - Currency plumbing and MoneyValue objects
|
|
94
|
+
- Analyzer/executor emit structured MoneyValue objects
|
|
95
|
+
- Schema `docs/schemas/reconciliation-v2.json` with `csv_format` support
|
|
96
|
+
- 2-3 leg combination match suggestions with insights
|
|
97
|
+
- Handler uses `accounts.getAccount` with fallback
|
|
98
|
+
|
|
99
|
+
## [0.8.8] - 2025-10-13
|
|
100
|
+
|
|
101
|
+
### Changed
|
|
102
|
+
|
|
103
|
+
- Renamed package to `@dizzlkheinz/ynab-mcp-server`
|
|
104
|
+
|
|
105
|
+
## [0.8.7] - 2025-10-13
|
|
106
|
+
|
|
107
|
+
### Changed
|
|
108
|
+
|
|
109
|
+
- GitHub Actions runs unit tests before publish with provenance enabled
|
|
110
|
+
|
|
111
|
+
## [0.8.6] - 2025-10-13
|
|
112
|
+
|
|
113
|
+
### Changed
|
|
114
|
+
|
|
115
|
+
- Npm publish workflow runs unit tests only (no YNAB credentials needed)
|
|
116
|
+
|
|
117
|
+
## [0.8.5] - 2025-10-13
|
|
118
|
+
|
|
119
|
+
### Fixed
|
|
120
|
+
|
|
121
|
+
- Export transaction tests parse JSON instead of relying on spacing
|
|
122
|
+
|
|
123
|
+
## [0.8.4] - 2025-10-13
|
|
124
|
+
|
|
125
|
+
### Changed
|
|
126
|
+
|
|
127
|
+
- MCPB generation optional via cross-platform Node wrapper (CI compatible)
|
|
128
|
+
|
|
129
|
+
## [0.8.3] - 2025-10-13
|
|
130
|
+
|
|
131
|
+
### Changed
|
|
132
|
+
|
|
133
|
+
- CLI launchers: `npx @dizzlkheinz/ynab-mcp-server` starts server immediately
|
|
134
|
+
- GitHub Actions workflow publishes to npm with provenance
|
|
135
|
+
|
|
136
|
+
## [0.8.2] - 2025-10-13
|
|
137
|
+
|
|
138
|
+
### Added
|
|
139
|
+
|
|
140
|
+
- `create_receipt_split_transaction` - Converts categorized receipts to YNAB splits
|
|
141
|
+
- Proportional tax distribution
|
|
142
|
+
- Optional dry-run previews
|
|
143
|
+
|
|
144
|
+
## [0.8.1] - 2025-10-02
|
|
145
|
+
|
|
146
|
+
### Added
|
|
147
|
+
|
|
148
|
+
- Split transaction support in `create_transaction`
|
|
149
|
+
- Schema validation and response formatting for subtransactions
|
|
150
|
+
- Detailed subtransaction data in responses
|
|
151
|
+
|
|
152
|
+
## [0.8.0] - 2025-09-28
|
|
153
|
+
|
|
154
|
+
### Fixed
|
|
155
|
+
|
|
156
|
+
- TypeScript build error in `compareTransactions` (inlined date comparison, non-null assertions)
|
|
157
|
+
|
|
158
|
+
## [0.7.0] - 2025-09-23
|
|
159
|
+
|
|
160
|
+
### Added
|
|
161
|
+
|
|
162
|
+
- Automatic amount conversion: milliunits → dollars
|
|
163
|
+
- Utility functions: `milliunitsToAmount`, `amountToMilliunits`, `formatAmount`
|
|
164
|
+
|
|
165
|
+
### Changed
|
|
166
|
+
|
|
167
|
+
- **BREAKING**: All API responses return amounts in dollars (not milliunits)
|
|
168
|
+
- Account balances, transactions, budgets now use dollar format
|
|
169
|
+
|
|
170
|
+
### Fixed
|
|
171
|
+
|
|
172
|
+
- Amount confusion: `-1924370` milliunits → `-$1,924.37` (not `-$1,924,370`)
|
|
173
|
+
|
|
174
|
+
## [0.6.0] - 2025-09-16
|
|
175
|
+
|
|
176
|
+
### Added
|
|
177
|
+
|
|
178
|
+
- `diagnostic_info` tool consolidates debug tools (80% reduction in clutter)
|
|
179
|
+
- Enhanced bank reconciliation
|
|
180
|
+
- Smart duplicate amount matching with chronological preference
|
|
181
|
+
- Automatic date adjustment for transaction sync
|
|
182
|
+
- Exact balance matching (zero tolerance)
|
|
183
|
+
- Improved date range reporting
|
|
184
|
+
|
|
185
|
+
### Fixed
|
|
186
|
+
|
|
187
|
+
- Multiple identical transaction handling in reconciliation
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,414 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
This is a Model Context Protocol (MCP) server for YNAB (You Need A Budget) integration, enabling AI assistants to interact with YNAB budgets, accounts, transactions, and categories. The codebase uses TypeScript with a modular architecture introduced in v0.8.x.
|
|
8
|
+
|
|
9
|
+
## Essential Commands
|
|
10
|
+
|
|
11
|
+
### Build & Development
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm run build # Clean, compile TypeScript, and bundle
|
|
15
|
+
npm run build:no-lint # Build without running linter
|
|
16
|
+
npm run build:prod # Production build with verification
|
|
17
|
+
npm run dev # TypeScript watch mode for development
|
|
18
|
+
npm run type-check # Run TypeScript type checking without emitting files
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
See [docs/development/BUILD.md](docs/development/BUILD.md) for detailed build information.
|
|
22
|
+
|
|
23
|
+
### Testing
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm test # Run all unit tests + filter results
|
|
27
|
+
npm run test:unit # Unit tests only (fast, mocked dependencies)
|
|
28
|
+
npm run test:integration # Integration tests with mocked YNAB API
|
|
29
|
+
npm run test:e2e # End-to-end tests (requires real YNAB token)
|
|
30
|
+
npm run test:performance # Performance and load tests
|
|
31
|
+
npm run test:coverage # Generate coverage report (requires 80% coverage)
|
|
32
|
+
npm run test:watch # Watch mode for test development
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
See [docs/guides/TESTING.md](docs/guides/TESTING.md) for comprehensive testing documentation.
|
|
36
|
+
|
|
37
|
+
### Code Quality
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
npm run lint # Run ESLint on TypeScript files
|
|
41
|
+
npm run lint:fix # Auto-fix ESLint issues
|
|
42
|
+
npm run format # Format code with Prettier
|
|
43
|
+
npm run format:check # Check formatting without modifying files
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Packaging & Distribution
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm run package:mcpb # Build production MCPB package for Claude Desktop
|
|
50
|
+
npm run generate:mcpb # Generate MCPB file from built bundle
|
|
51
|
+
npm run bundle # Bundle with esbuild (development)
|
|
52
|
+
npm run bundle:prod # Bundle with minification (production)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
See [docs/guides/DEPLOYMENT.md](docs/guides/DEPLOYMENT.md) for deployment instructions.
|
|
56
|
+
|
|
57
|
+
## Architecture Overview
|
|
58
|
+
|
|
59
|
+
The v0.8.x architecture is modular and service-oriented:
|
|
60
|
+
|
|
61
|
+
### Core Server Components (`src/server/`)
|
|
62
|
+
|
|
63
|
+
- **YNABMCPServer.ts** - Main orchestration server, coordinates all services
|
|
64
|
+
- **toolRegistry.ts** - Centralized tool metadata, validation, and execution
|
|
65
|
+
- **cacheManager.ts** - Enhanced caching with LRU eviction, observability, and stale-while-revalidate
|
|
66
|
+
- **budgetResolver.ts** - Consistent budget ID resolution across all tools
|
|
67
|
+
- **errorHandler.ts** - Centralized error handling with dependency injection
|
|
68
|
+
- **config.ts** - Environment validation and server configuration
|
|
69
|
+
- **resources.ts** - MCP resource definitions and handlers
|
|
70
|
+
- **prompts.ts** - MCP prompt definitions and handlers
|
|
71
|
+
- **diagnostics.ts** - System diagnostics and health monitoring
|
|
72
|
+
- **securityMiddleware.ts** - Security validation and wrapper functions
|
|
73
|
+
- **responseFormatter.ts** - JSON response formatting (minification/pretty-print)
|
|
74
|
+
- **rateLimiter.ts** - Rate limiting for YNAB API compliance
|
|
75
|
+
- **requestLogger.ts** - Request/response logging middleware
|
|
76
|
+
|
|
77
|
+
### Tool Implementation (`src/tools/`)
|
|
78
|
+
|
|
79
|
+
Tools are organized by domain with some using modular sub-directories:
|
|
80
|
+
|
|
81
|
+
- **budgetTools.ts** - Budget listing and retrieval
|
|
82
|
+
- **accountTools.ts** - Account management
|
|
83
|
+
- **transactionTools.ts** - Transaction CRUD operations
|
|
84
|
+
- **categoryTools.ts** - Category management
|
|
85
|
+
- **payeeTools.ts** - Payee listing and retrieval
|
|
86
|
+
- **monthTools.ts** - Monthly budget data
|
|
87
|
+
- **utilityTools.ts** - User info and amount conversion
|
|
88
|
+
- **exportTransactions.ts** - Transaction export to JSON files
|
|
89
|
+
- **reconcileAccount.ts** - Comprehensive account reconciliation
|
|
90
|
+
|
|
91
|
+
**Modular Tool Directories:**
|
|
92
|
+
|
|
93
|
+
- **compareTransactions/** - CSV comparison tools split into parser, matcher, formatter
|
|
94
|
+
- **financialOverview/** - Financial analysis split into schemas, handlers, insights, trends, formatter
|
|
95
|
+
|
|
96
|
+
### Type Definitions (`src/types/`)
|
|
97
|
+
|
|
98
|
+
- **index.ts** - Shared types, error classes, server configuration
|
|
99
|
+
|
|
100
|
+
### Utilities (`src/utils/`)
|
|
101
|
+
|
|
102
|
+
- **money.ts** - Amount conversion (dollars ↔ milliunits)
|
|
103
|
+
- **dateUtils.ts** - Date formatting and validation
|
|
104
|
+
- **amountUtils.ts** - Amount validation and utilities
|
|
105
|
+
|
|
106
|
+
## Key Architecture Patterns
|
|
107
|
+
|
|
108
|
+
### Tool Registry Pattern
|
|
109
|
+
|
|
110
|
+
All tools register through the centralized `ToolRegistry` for consistent validation, security, and error handling:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
registry.register({
|
|
114
|
+
name: 'my_tool',
|
|
115
|
+
description: 'Tool description',
|
|
116
|
+
inputSchema: MyToolSchema, // Zod schema
|
|
117
|
+
handler: adapt(handleMyTool), // Handler function
|
|
118
|
+
defaultArgumentResolver: resolveBudgetId(), // Optional auto-resolution
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Enhanced Caching (v0.8.x)
|
|
123
|
+
|
|
124
|
+
Use `cacheManager.wrap()` for automatic caching with observability:
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
return cacheManager.wrap('cache_key', {
|
|
128
|
+
ttl: CACHE_TTLS.ACCOUNTS, // Predefined TTL constants
|
|
129
|
+
staleWhileRevalidate: 120000, // Optional background refresh
|
|
130
|
+
loader: () => expensiveOperation(),
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Cache TTL constants are defined in `cacheManager.ts`:
|
|
135
|
+
|
|
136
|
+
- `CACHE_TTLS.BUDGETS` - 1 hour (rarely changes)
|
|
137
|
+
- `CACHE_TTLS.ACCOUNTS` - 30 minutes
|
|
138
|
+
- `CACHE_TTLS.CATEGORIES` - 30 minutes
|
|
139
|
+
- `CACHE_TTLS.SHORT` - 5 minutes (transactions)
|
|
140
|
+
- `CACHE_TTLS.LONG` - 1 hour
|
|
141
|
+
|
|
142
|
+
### Budget Resolution Pattern
|
|
143
|
+
|
|
144
|
+
Use `BudgetResolver` for consistent budget ID handling:
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
const resolved = BudgetResolver.resolveBudgetId(providedId, defaultId);
|
|
148
|
+
if (typeof resolved !== 'string') {
|
|
149
|
+
return resolved; // Returns formatted error response
|
|
150
|
+
}
|
|
151
|
+
// Use resolved budget ID
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Error Handling Pattern
|
|
155
|
+
|
|
156
|
+
Use centralized `ErrorHandler` for consistent error responses:
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
return ErrorHandler.createErrorResponse('OPERATION_FAILED', 'Detailed error message', {
|
|
160
|
+
operation: 'tool_name',
|
|
161
|
+
additionalContext,
|
|
162
|
+
});
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Dependency Injection
|
|
166
|
+
|
|
167
|
+
Services use explicit dependency injection for testability:
|
|
168
|
+
|
|
169
|
+
```typescript
|
|
170
|
+
constructor(
|
|
171
|
+
private cacheManager: CacheManager,
|
|
172
|
+
private errorHandler: ErrorHandler,
|
|
173
|
+
private budgetResolver: BudgetResolver
|
|
174
|
+
) {}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Tool Annotations
|
|
178
|
+
|
|
179
|
+
All tools include MCP-compliant annotations as advisory hints for AI clients. These annotations follow the Model Context Protocol specification and help AI assistants understand tool capabilities, safety characteristics, and expected behavior. The annotation system uses type-safe presets defined in `src/tools/toolCategories.ts` via the `ToolAnnotationPresets` constant.
|
|
180
|
+
|
|
181
|
+
### Annotation Hints
|
|
182
|
+
|
|
183
|
+
Each tool includes the following annotation fields:
|
|
184
|
+
|
|
185
|
+
- **`title`** - Human-readable tool name for UI display (e.g., "YNAB: List Budgets")
|
|
186
|
+
- **`readOnlyHint`** - Whether tool only reads data without modifications (boolean)
|
|
187
|
+
- **`destructiveHint`** - Whether tool performs irreversible operations like deletion (boolean)
|
|
188
|
+
- **`idempotentHint`** - Whether repeated identical calls are safe and produce same result (boolean)
|
|
189
|
+
- **`openWorldHint`** - Whether tool calls external APIs (YNAB API) vs local operations (boolean)
|
|
190
|
+
|
|
191
|
+
### Tool Categories
|
|
192
|
+
|
|
193
|
+
The system defines 5 preset annotation patterns in `src/tools/toolCategories.ts`:
|
|
194
|
+
|
|
195
|
+
- **READ_ONLY_EXTERNAL** - Read-only tools querying YNAB API
|
|
196
|
+
- Examples: `list_budgets`, `get_account`, `list_transactions`
|
|
197
|
+
- Characteristics: Read-only, idempotent, external API calls
|
|
198
|
+
|
|
199
|
+
- **WRITE_EXTERNAL_CREATE** - Tools creating new resources, non-idempotent
|
|
200
|
+
- Examples: `create_transaction`, `create_account`
|
|
201
|
+
- Characteristics: Write operations, non-idempotent (repeated calls create duplicates), external API
|
|
202
|
+
|
|
203
|
+
- **WRITE_EXTERNAL_UPDATE** - Tools updating existing resources, idempotent
|
|
204
|
+
- Examples: `update_transaction`, `set_default_budget`, `reconcile_account`
|
|
205
|
+
- Characteristics: Write operations, idempotent (repeated calls produce same result), external API
|
|
206
|
+
|
|
207
|
+
- **WRITE_EXTERNAL_DELETE** - Destructive tools deleting resources
|
|
208
|
+
- Example: `delete_transaction` ⚠️
|
|
209
|
+
- Characteristics: Write operations, destructive, idempotent, external API
|
|
210
|
+
|
|
211
|
+
- **UTILITY_LOCAL** - Local utility tools without external API calls
|
|
212
|
+
- Examples: `convert_amount`, `clear_cache`, `diagnostic_info`
|
|
213
|
+
- Characteristics: Local operations, no external API dependencies
|
|
214
|
+
|
|
215
|
+
### Complete Tool Classification
|
|
216
|
+
|
|
217
|
+
All 30 tools are classified into the following categories:
|
|
218
|
+
|
|
219
|
+
**Read-Only External (15 tools):**
|
|
220
|
+
|
|
221
|
+
- `list_budgets`, `get_budget`, `list_accounts`, `get_account`, `list_transactions`, `export_transactions`, `compare_transactions`, `get_transaction`, `list_categories`, `get_category`, `list_payees`, `get_payee`, `get_month`, `list_months`, `get_user`
|
|
222
|
+
|
|
223
|
+
**Write External - Create (4 tools):**
|
|
224
|
+
|
|
225
|
+
- `create_account`, `create_transaction`, `create_transactions`, `create_receipt_split_transaction`
|
|
226
|
+
|
|
227
|
+
**Write External - Update (5 tools):**
|
|
228
|
+
|
|
229
|
+
- `set_default_budget`, `reconcile_account`, `update_transaction`, `update_transactions`, `update_category`
|
|
230
|
+
|
|
231
|
+
**Write External - Delete (1 tool):**
|
|
232
|
+
|
|
233
|
+
- `delete_transaction` ⚠️
|
|
234
|
+
|
|
235
|
+
**Utility Local (5 tools):**
|
|
236
|
+
|
|
237
|
+
- `get_default_budget`, `convert_amount`, `diagnostic_info`, `clear_cache`, `set_output_format`
|
|
238
|
+
|
|
239
|
+
### Expected Benefits
|
|
240
|
+
|
|
241
|
+
The tool annotation system provides several advantages:
|
|
242
|
+
|
|
243
|
+
- **Enhanced AI Client UX** - AI assistants like Claude can show warnings/confirmations for destructive tools
|
|
244
|
+
- **Safer Workflows** - AI understands which tools are dangerous and can prompt for confirmation before execution
|
|
245
|
+
- **Better Tool Discovery** - Annotations help AI clients understand tool capabilities and constraints
|
|
246
|
+
- **Future-Proof Integration** - As more MCP clients emerge, they'll respect these standard annotations
|
|
247
|
+
- **Self-Documenting API** - Metadata provides clear documentation of tool behavior without reading implementation
|
|
248
|
+
- **Zero Breaking Changes** - Fully backward compatible, annotations are advisory only and don't affect tool execution
|
|
249
|
+
|
|
250
|
+
### Usage Example
|
|
251
|
+
|
|
252
|
+
Tool annotations are applied during tool registration using preset patterns:
|
|
253
|
+
|
|
254
|
+
```typescript
|
|
255
|
+
import { ToolAnnotationPresets } from '../tools/toolCategories.js';
|
|
256
|
+
|
|
257
|
+
register({
|
|
258
|
+
name: 'delete_transaction',
|
|
259
|
+
description: 'Delete a transaction',
|
|
260
|
+
inputSchema: DeleteTransactionSchema,
|
|
261
|
+
handler: adaptWrite(handleDeleteTransaction),
|
|
262
|
+
metadata: {
|
|
263
|
+
annotations: {
|
|
264
|
+
...ToolAnnotationPresets.WRITE_EXTERNAL_DELETE,
|
|
265
|
+
title: 'YNAB: Delete Transaction',
|
|
266
|
+
},
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Amount Handling (Critical!)
|
|
272
|
+
|
|
273
|
+
YNAB uses **milliunits** internally (1 dollar = 1000 milliunits):
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
// Converting amounts
|
|
277
|
+
import { milliunitsToAmount, amountToMilliunits } from './utils/money.js';
|
|
278
|
+
|
|
279
|
+
const dollars = milliunitsToAmount(25500); // 25.50
|
|
280
|
+
const milliunits = amountToMilliunits(25.5); // 25500
|
|
281
|
+
|
|
282
|
+
// ALL API calls require milliunits
|
|
283
|
+
await createTransaction({
|
|
284
|
+
amount: amountToMilliunits(userInputDollars), // Convert first!
|
|
285
|
+
// ...
|
|
286
|
+
});
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Testing Guidelines
|
|
290
|
+
|
|
291
|
+
### Test File Naming
|
|
292
|
+
|
|
293
|
+
- `*.test.ts` - Unit tests
|
|
294
|
+
- `*.integration.test.ts` - Integration tests with mocked API
|
|
295
|
+
- `*.e2e.test.ts` - End-to-end tests with real API (requires YNAB token)
|
|
296
|
+
|
|
297
|
+
### Test Organization
|
|
298
|
+
|
|
299
|
+
- Tests live in `__tests__/` directories next to source files
|
|
300
|
+
- Use `src/__tests__/testUtils.ts` for shared test utilities
|
|
301
|
+
- Use `src/__tests__/setup.ts` for global test setup
|
|
302
|
+
|
|
303
|
+
### Coverage Requirements
|
|
304
|
+
|
|
305
|
+
Minimum 80% coverage for all metrics (branches, functions, lines, statements)
|
|
306
|
+
|
|
307
|
+
### Running Specific Tests
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
vitest run src/tools/__tests__/budgetTools.test.ts # Run single test file
|
|
311
|
+
vitest run --project unit # Run only unit tests
|
|
312
|
+
vitest run --project integration # Run only integration tests
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Environment Variables
|
|
316
|
+
|
|
317
|
+
Required:
|
|
318
|
+
|
|
319
|
+
- `YNAB_ACCESS_TOKEN` - YNAB Personal Access Token
|
|
320
|
+
|
|
321
|
+
Optional (Caching):
|
|
322
|
+
|
|
323
|
+
- `YNAB_MCP_CACHE_MAX_ENTRIES` (default: 1000)
|
|
324
|
+
- `YNAB_MCP_CACHE_DEFAULT_TTL_MS` (default: 1800000 / 30 min)
|
|
325
|
+
- `YNAB_MCP_CACHE_STALE_MS` (default: 120000 / 2 min)
|
|
326
|
+
|
|
327
|
+
Optional (Output):
|
|
328
|
+
|
|
329
|
+
- `YNAB_MCP_MINIFY_OUTPUT` (default: true) - Minify JSON responses
|
|
330
|
+
- `YNAB_MCP_PRETTY_SPACES` (default: 2) - Spaces for pretty-print when not minified
|
|
331
|
+
|
|
332
|
+
Optional (Export):
|
|
333
|
+
|
|
334
|
+
- `YNAB_EXPORT_PATH` - Directory for exported files (default: ~/Downloads or ~/Documents)
|
|
335
|
+
|
|
336
|
+
Optional (Testing):
|
|
337
|
+
|
|
338
|
+
- `TEST_BUDGET_ID` - Specific budget for E2E tests
|
|
339
|
+
- `TEST_ACCOUNT_ID` - Specific account for E2E tests
|
|
340
|
+
- `SKIP_E2E_TESTS` - Skip E2E tests if set
|
|
341
|
+
|
|
342
|
+
## TypeScript Configuration
|
|
343
|
+
|
|
344
|
+
Strict mode enabled with extensive safety checks:
|
|
345
|
+
|
|
346
|
+
- `strict: true` - All strict mode flags enabled
|
|
347
|
+
- `noImplicitAny`, `noImplicitReturns`, `noImplicitThis` - Prevent implicit any usage
|
|
348
|
+
- `noUnusedLocals`, `noUnusedParameters` - Prevent unused variables
|
|
349
|
+
- `exactOptionalPropertyTypes` - Stricter optional property handling
|
|
350
|
+
- `noUncheckedIndexedAccess` - Safer array/object indexing
|
|
351
|
+
- `allowUnreachableCode: false` - Error on unreachable code
|
|
352
|
+
|
|
353
|
+
## Code Style & Linting
|
|
354
|
+
|
|
355
|
+
- **ESLint**: Enforced on all TypeScript files
|
|
356
|
+
- **Prettier**: Auto-formatting for consistent style
|
|
357
|
+
- **Import Style**: Use `.js` extensions in imports (ES modules)
|
|
358
|
+
- **Naming**: camelCase for functions/variables, PascalCase for classes/types
|
|
359
|
+
|
|
360
|
+
## Common Development Tasks
|
|
361
|
+
|
|
362
|
+
### Adding a New Tool
|
|
363
|
+
|
|
364
|
+
1. Create Zod schema in appropriate tool file (e.g., `src/tools/myTools.ts`)
|
|
365
|
+
2. Implement handler function following existing patterns
|
|
366
|
+
3. Register tool in `YNABMCPServer.ts` using `ToolRegistry`
|
|
367
|
+
4. Add unit tests in `src/tools/__tests__/myTools.test.ts`
|
|
368
|
+
5. Add integration tests in `src/tools/__tests__/myTools.integration.test.ts`
|
|
369
|
+
6. Update API documentation in `docs/API.md`
|
|
370
|
+
|
|
371
|
+
### Modifying Cache Behavior
|
|
372
|
+
|
|
373
|
+
Cache configuration is in `src/server/cacheManager.ts`. Adjust TTLs in the `CACHE_TTLS` constant or modify cache wrapper logic.
|
|
374
|
+
|
|
375
|
+
### Adding Service Modules
|
|
376
|
+
|
|
377
|
+
Service modules (like diagnostics, resources, prompts) follow a pattern:
|
|
378
|
+
|
|
379
|
+
1. Create module in `src/server/`
|
|
380
|
+
2. Implement with dependency injection pattern
|
|
381
|
+
3. Register in `YNABMCPServer` constructor
|
|
382
|
+
4. Add tests in `src/server/__tests__/`
|
|
383
|
+
|
|
384
|
+
## MCPB Packaging for Claude Desktop
|
|
385
|
+
|
|
386
|
+
The project builds a `.mcpb` file (MCP extension for Claude Desktop):
|
|
387
|
+
|
|
388
|
+
```bash
|
|
389
|
+
npm run package:mcpb
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
Output: `dist/ynab-mcp-server-<version>.mcpb`
|
|
393
|
+
|
|
394
|
+
The MCPB includes:
|
|
395
|
+
|
|
396
|
+
- Bundled Node.js code (single file, no node_modules)
|
|
397
|
+
- Manifest with extension metadata
|
|
398
|
+
- Environment variable configuration schema
|
|
399
|
+
|
|
400
|
+
## Git & Version Control
|
|
401
|
+
|
|
402
|
+
- **Main branch**: `master`
|
|
403
|
+
- **Versioning**: Semantic versioning (currently 0.x.y - pre-1.0 API)
|
|
404
|
+
- **Commit style**: Conventional commits encouraged (feat:, fix:, chore:, etc.)
|
|
405
|
+
|
|
406
|
+
## Important Notes
|
|
407
|
+
|
|
408
|
+
- **Backward Compatibility**: v0.8.x maintains 100% API compatibility with v0.7.x
|
|
409
|
+
- **Cache Invalidation**: Write operations (create, update, delete) should invalidate related caches
|
|
410
|
+
- **Date Format**: Always use ISO format `YYYY-MM-DD` for dates
|
|
411
|
+
- **Budget ID Resolution**: Most tools auto-resolve budget_id from default budget if not provided
|
|
412
|
+
- **Error Responses**: All errors return consistent JSON format via `ErrorHandler`
|
|
413
|
+
- **Security**: Input validation via Zod schemas, security middleware wraps all tool executions
|
|
414
|
+
- **Rate Limiting**: YNAB API has rate limits - use caching aggressively
|