@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,1450 @@
|
|
|
1
|
+
# YNAB MCP Server API Reference
|
|
2
|
+
|
|
3
|
+
This document provides comprehensive documentation for all tools available in the YNAB MCP Server, including parameters, examples, and error handling.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Overview](#overview)
|
|
8
|
+
- [Authentication](#authentication)
|
|
9
|
+
- [Data Formats](#data-formats)
|
|
10
|
+
- [Budget Management Tools](#budget-management-tools)
|
|
11
|
+
- [Account Management Tools](#account-management-tools)
|
|
12
|
+
- [Transaction Management Tools](#transaction-management-tools)
|
|
13
|
+
- [Category Management Tools](#category-management-tools)
|
|
14
|
+
- [Payee Management Tools](#payee-management-tools)
|
|
15
|
+
- [Monthly Data Tools](#monthly-data-tools)
|
|
16
|
+
- [Utility Tools](#utility-tools)
|
|
17
|
+
- [Diagnostic Tools](#diagnostic-tools)
|
|
18
|
+
- [Error Handling](#error-handling)
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
The YNAB MCP Server provides 30 tools that enable AI assistants to interact with YNAB data. All tools follow consistent patterns for parameters, responses, and error handling.
|
|
23
|
+
|
|
24
|
+
### Tool Naming Convention
|
|
25
|
+
|
|
26
|
+
All tools follow a simple naming pattern with an action and resource:
|
|
27
|
+
- `list_budgets` - List operation on budgets
|
|
28
|
+
- `get_budget` - Get operation on a specific budget
|
|
29
|
+
- `create_transaction` - Create operation for transactions
|
|
30
|
+
|
|
31
|
+
## Authentication
|
|
32
|
+
|
|
33
|
+
All tools require authentication via a YNAB Personal Access Token set in the `YNAB_ACCESS_TOKEN` environment variable.
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
YNAB_ACCESS_TOKEN=your_personal_access_token_here
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Data Formats
|
|
40
|
+
|
|
41
|
+
### Monetary Amounts
|
|
42
|
+
|
|
43
|
+
**📢 New in v0.7.0**: All monetary amounts are automatically converted to standard dollar format for human readability.
|
|
44
|
+
|
|
45
|
+
The server automatically converts YNAB's internal milliunits to dollars in all responses:
|
|
46
|
+
- Account balances: `-1924.37` (instead of `-1924370` milliunits)
|
|
47
|
+
- Transaction amounts: `50.25` (instead of `50250` milliunits)
|
|
48
|
+
- Budget amounts: `150.00` (instead of `150000` milliunits)
|
|
49
|
+
|
|
50
|
+
**Input formats**:
|
|
51
|
+
- When creating transactions, amounts should be provided in milliunits (as per YNAB API requirements)
|
|
52
|
+
- Use the `convert_amount` tool to convert between dollars and milliunits if needed
|
|
53
|
+
|
|
54
|
+
**Legacy behavior**: YNAB's internal representation uses milliunits (1/1000th of currency unit), but this is now transparent to users
|
|
55
|
+
|
|
56
|
+
### Dates
|
|
57
|
+
|
|
58
|
+
All dates use ISO 8601 format: `YYYY-MM-DD`
|
|
59
|
+
- Example: `2024-01-15`
|
|
60
|
+
- Time zones are handled by YNAB based on your account settings
|
|
61
|
+
|
|
62
|
+
### IDs
|
|
63
|
+
|
|
64
|
+
All YNAB IDs are UUID strings:
|
|
65
|
+
- Budget ID: `12345678-1234-1234-1234-123456789012`
|
|
66
|
+
- Account ID: `87654321-4321-4321-4321-210987654321`
|
|
67
|
+
|
|
68
|
+
## Budget Management Tools
|
|
69
|
+
|
|
70
|
+
### list_budgets
|
|
71
|
+
|
|
72
|
+
Lists all budgets associated with the user's account.
|
|
73
|
+
|
|
74
|
+
**Parameters:** None
|
|
75
|
+
|
|
76
|
+
**Example Request:**
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"name": "list_budgets",
|
|
80
|
+
"arguments": {}
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**Example Response:**
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"content": [
|
|
88
|
+
{
|
|
89
|
+
"type": "text",
|
|
90
|
+
"text": "{\n \"budgets\": [\n {\n \"id\": \"12345678-1234-1234-1234-123456789012\",\n \"name\": \"My Budget\",\n \"last_modified_on\": \"2024-01-15T10:30:00.000Z\",\n \"first_month\": \"2024-01-01\",\n \"last_month\": \"2024-12-01\",\n \"date_format\": {\n \"format\": \"MM/DD/YYYY\"\n },\n \"currency_format\": {\n \"iso_code\": \"USD\",\n \"example_format\": \"123,456.78\",\n \"decimal_digits\": 2,\n \"decimal_separator\": \".\",\n \"symbol_first\": true,\n \"group_separator\": \",\",\n \"currency_symbol\": \"$\",\n \"display_symbol\": true\n }\n }\n ]\n}"
|
|
91
|
+
}
|
|
92
|
+
]
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### get_budget
|
|
97
|
+
|
|
98
|
+
Gets detailed information for a specific budget.
|
|
99
|
+
|
|
100
|
+
**Parameters:**
|
|
101
|
+
- `budget_id` (string, required): The ID of the budget to retrieve
|
|
102
|
+
|
|
103
|
+
**Example Request:**
|
|
104
|
+
```json
|
|
105
|
+
{
|
|
106
|
+
"name": "get_budget",
|
|
107
|
+
"arguments": {
|
|
108
|
+
"budget_id": "12345678-1234-1234-1234-123456789012"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**Example Response:**
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"content": [
|
|
117
|
+
{
|
|
118
|
+
"type": "text",
|
|
119
|
+
"text": "{\n \"budget\": {\n \"id\": \"12345678-1234-1234-1234-123456789012\",\n \"name\": \"My Budget\",\n \"last_modified_on\": \"2024-01-15T10:30:00.000Z\",\n \"first_month\": \"2024-01-01\",\n \"last_month\": \"2024-12-01\",\n \"accounts\": [...],\n \"payees\": [...],\n \"payee_locations\": [...],\n \"category_groups\": [...],\n \"categories\": [...],\n \"months\": [...],\n \"transactions\": [...],\n \"subtransactions\": [...],\n \"scheduled_transactions\": [...],\n \"scheduled_subtransactions\": [...]\n }\n}"
|
|
120
|
+
}
|
|
121
|
+
]
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Account Management Tools
|
|
126
|
+
|
|
127
|
+
### list_accounts
|
|
128
|
+
|
|
129
|
+
Lists all accounts for a specific budget.
|
|
130
|
+
|
|
131
|
+
**Parameters:**
|
|
132
|
+
- `budget_id` (string, required): The ID of the budget
|
|
133
|
+
|
|
134
|
+
**Example Request:**
|
|
135
|
+
```json
|
|
136
|
+
{
|
|
137
|
+
"name": "list_accounts",
|
|
138
|
+
"arguments": {
|
|
139
|
+
"budget_id": "12345678-1234-1234-1234-123456789012"
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Example Response:**
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"content": [
|
|
148
|
+
{
|
|
149
|
+
"type": "text",
|
|
150
|
+
"text": "{\n \"accounts\": [\n {\n \"id\": \"87654321-4321-4321-4321-210987654321\",\n \"name\": \"Checking Account\",\n \"type\": \"checking\",\n \"on_budget\": true,\n \"closed\": false,\n \"note\": null,\n \"balance\": 150000,\n \"cleared_balance\": 145000,\n \"uncleared_balance\": 5000,\n \"transfer_payee_id\": \"transfer-payee-id\",\n \"direct_import_linked\": false,\n \"direct_import_in_error\": false,\n \"last_reconciled_at\": null,\n \"debt_original_balance\": null,\n \"debt_interest_rates\": {},\n \"debt_minimum_payments\": {},\n \"debt_escrow_amounts\": {}\n }\n ]\n}"
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### get_account
|
|
157
|
+
|
|
158
|
+
Gets detailed information for a specific account.
|
|
159
|
+
|
|
160
|
+
**Parameters:**
|
|
161
|
+
- `budget_id` (string, required): The ID of the budget
|
|
162
|
+
- `account_id` (string, required): The ID of the account
|
|
163
|
+
|
|
164
|
+
**Example Request:**
|
|
165
|
+
```json
|
|
166
|
+
{
|
|
167
|
+
"name": "get_account",
|
|
168
|
+
"arguments": {
|
|
169
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
170
|
+
"account_id": "87654321-4321-4321-4321-210987654321"
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### create_account
|
|
176
|
+
|
|
177
|
+
Creates a new account in the specified budget.
|
|
178
|
+
|
|
179
|
+
**Parameters:**
|
|
180
|
+
- `budget_id` (string, required): The ID of the budget
|
|
181
|
+
- `name` (string, required): The name of the new account
|
|
182
|
+
- `type` (string, required): The account type. Valid values:
|
|
183
|
+
- `checking` - Checking account
|
|
184
|
+
- `savings` - Savings account
|
|
185
|
+
- `creditCard` - Credit card account
|
|
186
|
+
- `cash` - Cash account
|
|
187
|
+
- `lineOfCredit` - Line of credit
|
|
188
|
+
- `otherAsset` - Other asset account
|
|
189
|
+
- `otherLiability` - Other liability account
|
|
190
|
+
- `balance` (number, optional): Initial balance in milliunits
|
|
191
|
+
- `dry_run` (boolean, optional): Validate and return simulated result; no API call
|
|
192
|
+
|
|
193
|
+
**Example Request:**
|
|
194
|
+
```json
|
|
195
|
+
{
|
|
196
|
+
"name": "create_account",
|
|
197
|
+
"arguments": {
|
|
198
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
199
|
+
"name": "New Savings Account",
|
|
200
|
+
"type": "savings",
|
|
201
|
+
"balance": 100000
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**Example Response:**
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"content": [
|
|
210
|
+
{
|
|
211
|
+
"type": "text",
|
|
212
|
+
"text": "{\n \"account\": {\n \"id\": \"new-account-id\",\n \"name\": \"New Savings Account\",\n \"type\": \"savings\",\n \"on_budget\": true,\n \"closed\": false,\n \"balance\": 100000,\n \"cleared_balance\": 100000,\n \"uncleared_balance\": 0\n }\n}"
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Transaction Management Tools
|
|
219
|
+
|
|
220
|
+
### list_transactions
|
|
221
|
+
|
|
222
|
+
Lists transactions for a budget with optional filtering.
|
|
223
|
+
|
|
224
|
+
**Parameters:**
|
|
225
|
+
- `budget_id` (string, required): The ID of the budget
|
|
226
|
+
- `account_id` (string, optional): Filter by account ID
|
|
227
|
+
- `category_id` (string, optional): Filter by category ID
|
|
228
|
+
- `since_date` (string, optional): Only return transactions on or after this date (YYYY-MM-DD)
|
|
229
|
+
- `type` (string, optional): Filter by transaction type (`uncategorized` or `unapproved`)
|
|
230
|
+
|
|
231
|
+
**Example Request:**
|
|
232
|
+
```json
|
|
233
|
+
{
|
|
234
|
+
"name": "list_transactions",
|
|
235
|
+
"arguments": {
|
|
236
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
237
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
238
|
+
"since_date": "2024-01-01"
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
**Example Response:**
|
|
244
|
+
```json
|
|
245
|
+
{
|
|
246
|
+
"content": [
|
|
247
|
+
{
|
|
248
|
+
"type": "text",
|
|
249
|
+
"text": "{\n \"transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5000,\n \"memo\": \"Coffee shop\",\n \"cleared\": \"cleared\",\n \"approved\": true,\n \"flag_color\": null,\n \"account_id\": \"87654321-4321-4321-4321-210987654321\",\n \"payee_id\": \"payee-id\",\n \"category_id\": \"category-id\",\n \"transfer_account_id\": null,\n \"transfer_transaction_id\": null,\n \"matched_transaction_id\": null,\n \"import_id\": null,\n \"import_payee_name\": null,\n \"import_payee_name_original\": null,\n \"debt_transaction_type\": null,\n \"deleted\": false\n }\n ]\n}"
|
|
250
|
+
}
|
|
251
|
+
]
|
|
252
|
+
}
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### export_transactions
|
|
256
|
+
|
|
257
|
+
Exports all transactions to a JSON file with descriptive filename and platform-specific default paths. This tool bypasses MCP response size limits by saving data to a file instead of returning it in the response.
|
|
258
|
+
|
|
259
|
+
**Parameters:**
|
|
260
|
+
- `budget_id` (string, required): The ID of the budget
|
|
261
|
+
- `account_id` (string, optional): Filter by account ID
|
|
262
|
+
- `category_id` (string, optional): Filter by category ID
|
|
263
|
+
- `since_date` (string, optional): Only export transactions on or after this date (YYYY-MM-DD)
|
|
264
|
+
- `type` (string, optional): Filter by transaction type (`uncategorized` or `unapproved`)
|
|
265
|
+
- `filename` (string, optional): Custom filename (auto-generated if not provided)
|
|
266
|
+
- `minimal` (boolean, optional): Export only essential fields for smaller files (default: true)
|
|
267
|
+
|
|
268
|
+
**Example Request:**
|
|
269
|
+
```json
|
|
270
|
+
{
|
|
271
|
+
"name": "export_transactions",
|
|
272
|
+
"arguments": {
|
|
273
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
274
|
+
"since_date": "2024-01-01"
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Example Response:**
|
|
280
|
+
```json
|
|
281
|
+
{
|
|
282
|
+
"content": [
|
|
283
|
+
{
|
|
284
|
+
"type": "text",
|
|
285
|
+
"text": "{\n \"message\": \"Successfully exported 1247 transactions\",\n \"filename\": \"ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"full_path\": \"C:\\\\Users\\\\YourName\\\\Downloads\\\\ynab_since_2024-01-01_1247items_2024-09-10_14-30-15.json\",\n \"export_directory\": \"C:\\\\Users\\\\YourName\\\\Downloads\",\n \"filename_explanation\": \"Filename format: ynab_{filters}_{count}items_{timestamp}.json - identifies what data was exported, when, and how many transactions\",\n \"preview_count\": 10,\n \"total_count\": 1247,\n \"preview_transactions\": [\n {\n \"id\": \"transaction-id\",\n \"date\": \"2024-01-15\",\n \"amount\": -5000,\n \"memo\": \"Coffee shop\",\n \"payee_name\": \"Starbucks\",\n \"category_name\": \"Dining Out\"\n }\n ]\n}"
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
**Export File Structure:**
|
|
292
|
+
The exported JSON file contains:
|
|
293
|
+
- `export_info`: Metadata about the export (timestamp, filters, count, minimal flag)
|
|
294
|
+
- `transactions`: Array of transaction objects
|
|
295
|
+
- **Minimal mode (default)**: `id`, `date`, `amount`, `payee_name`, `cleared`
|
|
296
|
+
- **Full mode**: All available transaction fields
|
|
297
|
+
|
|
298
|
+
**Platform-Specific Default Paths:**
|
|
299
|
+
- Windows/Mac: `~/Downloads`
|
|
300
|
+
- Linux/Unix: `~/Documents` (or `$XDG_DOCUMENTS_DIR`)
|
|
301
|
+
- Configurable via `YNAB_EXPORT_PATH` environment variable
|
|
302
|
+
|
|
303
|
+
### compare_transactions
|
|
304
|
+
|
|
305
|
+
Compares bank transactions from CSV files with YNAB transactions to identify missing entries in either direction. This tool helps with bank statement reconciliation by finding transactions that exist in your bank statement but not in YNAB (need to import) or vice versa (double-check for duplicates).
|
|
306
|
+
|
|
307
|
+
**Parameters:**
|
|
308
|
+
- `budget_id` (string, required): The ID of the budget to compare against
|
|
309
|
+
- `account_id` (string, required): The ID of the account to compare transactions for
|
|
310
|
+
- `csv_file_path` (string, optional): Path to CSV file containing bank transactions
|
|
311
|
+
- `csv_data` (string, optional): CSV data as string (alternative to csv_file_path)
|
|
312
|
+
- `amount_tolerance` (number, optional): Amount difference tolerance as decimal (0.01 = 1%, default: 0.01)
|
|
313
|
+
- `date_tolerance_days` (number, optional): Date difference tolerance in days (default: 5)
|
|
314
|
+
- `csv_format` (object, optional): CSV format configuration
|
|
315
|
+
- `date_column` (string): Column name for transaction date when `has_header: true`, or column index as string when `has_header: false` (default: "Date")
|
|
316
|
+
- `amount_column` (string): Column name for transaction amount when `has_header: true`, or column index as string when `has_header: false` (default: "Amount")
|
|
317
|
+
- `description_column` (string): Column name for transaction description when `has_header: true`, or column index as string when `has_header: false` (default: "Description")
|
|
318
|
+
- `date_format` (string): Date format pattern (default: "MM/DD/YYYY")
|
|
319
|
+
- `has_header` (boolean): Whether CSV has header row (default: true)
|
|
320
|
+
- `delimiter` (string): CSV delimiter character (default: ",")
|
|
321
|
+
|
|
322
|
+
**Example Request (CSV data):**
|
|
323
|
+
```json
|
|
324
|
+
{
|
|
325
|
+
"name": "compare_transactions",
|
|
326
|
+
"arguments": {
|
|
327
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
328
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
329
|
+
"csv_data": "Date,Amount,Description\n2024-01-01,100.00,Coffee Shop\n2024-01-02,-50.25,Gas Station\n2024-01-03,25.00,ATM Withdrawal"
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**Example Request (CSV file with custom format):**
|
|
335
|
+
```json
|
|
336
|
+
{
|
|
337
|
+
"name": "compare_transactions",
|
|
338
|
+
"arguments": {
|
|
339
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
340
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
341
|
+
"csv_file_path": "/path/to/bank-statement.csv",
|
|
342
|
+
"csv_format": {
|
|
343
|
+
"date_column": "Transaction Date",
|
|
344
|
+
"amount_column": "Dollar Amount",
|
|
345
|
+
"description_column": "Description",
|
|
346
|
+
"date_format": "DD/MM/YYYY",
|
|
347
|
+
"delimiter": ";",
|
|
348
|
+
"has_header": true
|
|
349
|
+
},
|
|
350
|
+
"amount_tolerance": 0.02,
|
|
351
|
+
"date_tolerance_days": 3
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Example Request (CSV without headers using column indices):**
|
|
357
|
+
```json
|
|
358
|
+
{
|
|
359
|
+
"name": "compare_transactions",
|
|
360
|
+
"arguments": {
|
|
361
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
362
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
363
|
+
"csv_data": "2024-01-01,100.00,Coffee Shop\n2024-01-02,-15.50,ATM Fee\n2024-01-03,250.00,Paycheck",
|
|
364
|
+
"csv_format": {
|
|
365
|
+
"date_column": "0",
|
|
366
|
+
"amount_column": "1",
|
|
367
|
+
"description_column": "2",
|
|
368
|
+
"date_format": "YYYY-MM-DD",
|
|
369
|
+
"has_header": false,
|
|
370
|
+
"delimiter": ","
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
**Example Response:**
|
|
377
|
+
```json
|
|
378
|
+
{
|
|
379
|
+
"content": [
|
|
380
|
+
{
|
|
381
|
+
"type": "text",
|
|
382
|
+
"text": "{\n \"summary\": {\n \"bank_transactions_count\": 15,\n \"ynab_transactions_count\": 12,\n \"matches_found\": 10,\n \"missing_in_ynab\": 5,\n \"missing_in_bank\": 2,\n \"date_range\": {\n \"start\": \"2024-01-01\",\n \"end\": \"2024-01-15\"\n },\n \"parameters\": {\n \"amount_tolerance\": 0.01,\n \"date_tolerance_days\": 5\n }\n },\n \"matches\": [\n {\n \"bank_date\": \"2024-01-01\",\n \"bank_amount\": \"100.00\",\n \"bank_description\": \"Coffee Shop\",\n \"ynab_date\": \"2024-01-01\",\n \"ynab_amount\": \"100.00\",\n \"ynab_payee\": \"Starbucks\",\n \"match_score\": 90,\n \"match_reasons\": [\"Exact date match\", \"Exact amount match\"]\n }\n ],\n \"missing_in_ynab\": [\n {\n \"date\": \"2024-01-03\",\n \"amount\": \"25.00\",\n \"description\": \"ATM Withdrawal\",\n \"row_number\": 4\n }\n ],\n \"missing_in_bank\": [\n {\n \"id\": \"transaction-xyz\",\n \"date\": \"2024-01-02\",\n \"amount\": \"-15.50\",\n \"payee_name\": \"Coffee Bean\",\n \"memo\": \"Morning coffee\",\n \"cleared\": \"cleared\"\n }\n ]\n}"
|
|
383
|
+
}
|
|
384
|
+
]
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
**Matching Algorithm:**
|
|
389
|
+
- **Date matching** (40 points max): Exact dates get full points, nearby dates get partial points
|
|
390
|
+
- **Amount matching** (50 points max): Exact amounts get full points, close amounts within tolerance get partial points
|
|
391
|
+
- **Description matching** (10 points max): Similarity between bank description and YNAB payee/memo
|
|
392
|
+
- **Smart Duplicate Handling**: Multiple transactions with identical amounts are matched using chronological order with chronology bonus (+15 points for same day, +10 for within 3 days)
|
|
393
|
+
- **Minimum match score**: 30 points required for a valid match
|
|
394
|
+
|
|
395
|
+
**Supported Date Formats:**
|
|
396
|
+
- `MM/DD/YYYY` or `M/D/YYYY` (default)
|
|
397
|
+
- `DD/MM/YYYY` or `D/M/YYYY`
|
|
398
|
+
- `YYYY-MM-DD` (ISO format)
|
|
399
|
+
- `MM-DD-YYYY`
|
|
400
|
+
|
|
401
|
+
**Use Cases:**
|
|
402
|
+
- **Bank reconciliation**: Find transactions missing from YNAB that need to be imported
|
|
403
|
+
- **Duplicate detection**: Identify YNAB transactions that don't appear in bank statements
|
|
404
|
+
- **Import verification**: Verify that imported transactions match your bank statement exactly
|
|
405
|
+
- **Data cleanup**: Find and resolve discrepancies between bank and YNAB data
|
|
406
|
+
|
|
407
|
+
### reconcile_account
|
|
408
|
+
|
|
409
|
+
Performs comprehensive account reconciliation with bank statement data. The tool returns **two content entries**: a human-readable narrative for assistants and a structured JSON payload (`version: "2.0"`) that encodes MoneyValue objects, insights, and optional execution results.
|
|
410
|
+
|
|
411
|
+
**Parameters (selected):**
|
|
412
|
+
- `budget_id` / `account_id` (string, required)
|
|
413
|
+
- `csv_file_path` or `csv_data` (one required)
|
|
414
|
+
- `statement_balance` (number, required) – ending cleared balance from the statement in dollars
|
|
415
|
+
- `statement_start_date`, `statement_end_date`, `statement_date` (string, optional)
|
|
416
|
+
- Matching controls: `date_tolerance_days` (default 2), `amount_tolerance_cents` (default 1), `auto_match_threshold` (default 90), `suggestion_threshold` (default 60)
|
|
417
|
+
- Execution controls (optional):
|
|
418
|
+
- `auto_create_transactions` (default `false`)
|
|
419
|
+
- `auto_update_cleared_status` (default `false`)
|
|
420
|
+
- `auto_unclear_missing` (default `true`)
|
|
421
|
+
- `auto_adjust_dates` (default `false`)
|
|
422
|
+
- `dry_run` (default `true`)
|
|
423
|
+
- `amount_tolerance` (deprecated decimal fallback – automatically inferred from `amount_tolerance_cents`)
|
|
424
|
+
- Other legacy options remain accepted for compatibility (`expected_bank_balance`, `balance_verification_mode`, `require_exact_match`, etc.).
|
|
425
|
+
|
|
426
|
+
**Example Request:**
|
|
427
|
+
```json
|
|
428
|
+
{
|
|
429
|
+
"name": "reconcile_account",
|
|
430
|
+
"arguments": {
|
|
431
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
432
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
433
|
+
"csv_data": "Date,Description,Amount\n2025-10-20,Amazon,-23.47\n2025-10-22,Coffee Shop,-4.50\n2025-10-23,Grocery Store,-67.89",
|
|
434
|
+
"statement_balance": -560.38,
|
|
435
|
+
"statement_start_date": "2025-10-01",
|
|
436
|
+
"statement_end_date": "2025-10-31",
|
|
437
|
+
"auto_create_transactions": true,
|
|
438
|
+
"dry_run": true
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
**Example Response (truncated):**
|
|
444
|
+
```json
|
|
445
|
+
{
|
|
446
|
+
"content": [
|
|
447
|
+
{
|
|
448
|
+
"type": "text",
|
|
449
|
+
"text": "📊 Checking Account Reconciliation Report\nStatement Range: 2025-10-01 to 2025-10-31\n\n• YNAB Cleared Balance: -$899.02\n• Statement Balance: -$921.24\n❌ Discrepancy: $22.22 (Statement shows more owed than YNAB)\n\nMatches: 5 auto, 1 suggested, 1 unmatched bank, 0 unmatched YNAB\n\nInsights:\n• [WARNING] 1 unmatched transaction at $22.22\n\nNext Steps:\n• Review 5 auto-matched transactions for approval\n• Add missing bank transaction\n\nDry run only — no YNAB changes were applied."
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"type": "text",
|
|
453
|
+
"text": "{\n \"version\": \"2.0\",\n \"schema_url\": \"https://raw.githubusercontent.com/dizzlkheinz/ynab-mcp-mcpb/master/docs/schemas/reconciliation-v2.json\",\n \"summary\": {\n \"bank_transactions_count\": 7,\n \"auto_matched\": 5,\n \"current_cleared_balance\": {\n \"value_milliunits\": -899020,\n \"value_display\": \"-$899.02\",\n \"currency\": \"USD\",\n \"direction\": \"debit\"\n },\n \"discrepancy\": {\n \"value_display\": \"$22.22\"\n }\n },\n \"balance\": {\n \"discrepancy_direction\": \"bank_higher\"\n },\n \"csv_format\": {\n \"delimiter\": \",\",\n \"decimal_separator\": \".\",\n \"thousands_separator\": null,\n \"date_format\": \"MM/DD/YYYY\",\n \"header_row\": true,\n \"date_column\": \"Date\",\n \"amount_column\": \"Amount\",\n \"payee_column\": \"Description\"\n },\n \"insights\": [ { \"id\": \"repeat-22.22\", \"type\": \"repeat_amount\" } ],\n \"matches\": { ... },\n \"unmatched\": { ... },\n \"execution\": {\n \"summary\": {\n \"matches_found\": 6,\n \"transactions_created\": 1,\n \"transactions_updated\": 2,\n \"dry_run\": false\n },\n \"account_balance\": {\n \"before\": { \"cleared_balance\": { \"value_display\": \"-$899.02\" }, ... },\n \"after\": { \"cleared_balance\": { \"value_display\": \"-$921.24\" }, ... }\n },\n \"recommendations\": [\"Review EvoCarShare discrepancy\"]\n }\n}"
|
|
454
|
+
}
|
|
455
|
+
]
|
|
456
|
+
}
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
When execution flags are enabled and `dry_run` is `false`, the structured payload includes an `execution` block with created/updated transactions, recommendations, and MoneyValue snapshots. The human narrative also summarizes applied actions.
|
|
460
|
+
|
|
461
|
+
**Key Output Sections:**
|
|
462
|
+
- `summary` – counts and MoneyValue balances for the statement window
|
|
463
|
+
- `balance` – MoneyValue snapshots plus discrepancy direction (`bank_higher`, `ynab_higher`, or `balanced`)
|
|
464
|
+
- `insights` – repeat-amount, near-match, and anomaly callouts with evidence
|
|
465
|
+
- `next_steps` – ordered suggestions for assistants to surface
|
|
466
|
+
- `matches`, `unmatched` – detailed transaction lists with MoneyValue fields for amounts
|
|
467
|
+
- `execution` (optional) – action totals, recommendations, and balance reconciliation metrics (MoneyValue)
|
|
468
|
+
- `recommendations` (optional) – actionable suggestions with complete parameters for executing YNAB tool calls
|
|
469
|
+
|
|
470
|
+
### Recommendations Field
|
|
471
|
+
|
|
472
|
+
The `reconcile_account_v2` tool now includes an optional `recommendations` array with actionable suggestions for resolving discrepancies.
|
|
473
|
+
|
|
474
|
+
#### Recommendation Types
|
|
475
|
+
|
|
476
|
+
**Create Transaction**
|
|
477
|
+
```json
|
|
478
|
+
{
|
|
479
|
+
"id": "rec-123",
|
|
480
|
+
"action_type": "create_transaction",
|
|
481
|
+
"priority": "high",
|
|
482
|
+
"confidence": 0.95,
|
|
483
|
+
"message": "Create transaction for EvoCarShare",
|
|
484
|
+
"reason": "This transaction exactly matches your $22.22 discrepancy",
|
|
485
|
+
"estimated_impact": {
|
|
486
|
+
"value": 22.22,
|
|
487
|
+
"value_display": "$22.22",
|
|
488
|
+
"currency": "USD"
|
|
489
|
+
},
|
|
490
|
+
"account_id": "abc123",
|
|
491
|
+
"parameters": {
|
|
492
|
+
"account_id": "abc123",
|
|
493
|
+
"date": "2024-01-15",
|
|
494
|
+
"amount": 22.22,
|
|
495
|
+
"payee_name": "EvoCarShare",
|
|
496
|
+
"memo": "Car rental",
|
|
497
|
+
"cleared": "cleared",
|
|
498
|
+
"approved": true
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
**Update Cleared Status**
|
|
504
|
+
```json
|
|
505
|
+
{
|
|
506
|
+
"id": "rec-456",
|
|
507
|
+
"action_type": "update_cleared",
|
|
508
|
+
"priority": "low",
|
|
509
|
+
"confidence": 0.6,
|
|
510
|
+
"message": "Mark transaction as cleared",
|
|
511
|
+
"parameters": {
|
|
512
|
+
"transaction_id": "ynab-txn-789",
|
|
513
|
+
"cleared": "cleared"
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
**Review Duplicate**
|
|
519
|
+
```json
|
|
520
|
+
{
|
|
521
|
+
"id": "rec-789",
|
|
522
|
+
"action_type": "review_duplicate",
|
|
523
|
+
"priority": "medium",
|
|
524
|
+
"confidence": 0.7,
|
|
525
|
+
"message": "Review possible duplicate",
|
|
526
|
+
"parameters": {
|
|
527
|
+
"candidate_ids": ["ynab-1", "ynab-2"],
|
|
528
|
+
"suggested_match_id": "ynab-1"
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
```
|
|
532
|
+
|
|
533
|
+
#### Executing Recommendations
|
|
534
|
+
|
|
535
|
+
Recommendations include complete parameters for YNAB MCP tool calls:
|
|
536
|
+
|
|
537
|
+
**CRITICAL**: Recommendation `parameters.amount` values are in **milliunits** (YNAB's internal format where 1 dollar = 1000 milliunits). These values are ready to pass directly to `create_transaction` without conversion. However, `estimated_impact.value` remains in decimal dollars for human readability.
|
|
538
|
+
|
|
539
|
+
```typescript
|
|
540
|
+
// For create_transaction recommendations:
|
|
541
|
+
// Note: Recommendation amounts are already in milliunits, ready to use directly
|
|
542
|
+
const rec = recommendations.find(r => r.action_type === 'create_transaction');
|
|
543
|
+
if (rec) {
|
|
544
|
+
await create_transaction({
|
|
545
|
+
budget_id: 'your-budget-id',
|
|
546
|
+
...rec.parameters // Parameters already contain amounts in milliunits
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// For update_cleared recommendations:
|
|
551
|
+
const updateRec = recommendations.find(r => r.action_type === 'update_cleared');
|
|
552
|
+
if (updateRec) {
|
|
553
|
+
await update_transaction({
|
|
554
|
+
budget_id: 'your-budget-id',
|
|
555
|
+
transaction_id: updateRec.parameters.transaction_id,
|
|
556
|
+
transaction: {
|
|
557
|
+
cleared: updateRec.parameters.cleared
|
|
558
|
+
}
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
#### Recommendation Priority
|
|
564
|
+
|
|
565
|
+
- **High**: Exact matches with 90%+ confidence, resolve immediately
|
|
566
|
+
- **Medium**: Likely matches with 60-89% confidence, review before executing
|
|
567
|
+
- **Low**: Suggestions requiring manual review, investigate further
|
|
568
|
+
|
|
569
|
+
#### Best Practices for Executing Recommendations
|
|
570
|
+
|
|
571
|
+
**Execution Order**
|
|
572
|
+
|
|
573
|
+
Process recommendations in the order they're returned (already sorted by priority and confidence):
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
for (const rec of recommendations) {
|
|
577
|
+
// High confidence (>0.9) can often be auto-executed
|
|
578
|
+
if (rec.confidence > 0.9 && rec.action_type === 'create_transaction') {
|
|
579
|
+
await executeRecommendation(rec);
|
|
580
|
+
} else {
|
|
581
|
+
// Lower confidence should be reviewed
|
|
582
|
+
await reviewAndExecute(rec);
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
```
|
|
586
|
+
|
|
587
|
+
**Batch Execution**
|
|
588
|
+
|
|
589
|
+
For multiple recommendations, execute in batches with review checkpoints:
|
|
590
|
+
|
|
591
|
+
```typescript
|
|
592
|
+
// Group by action type
|
|
593
|
+
const groups = {
|
|
594
|
+
create: recommendations.filter(r => r.action_type === 'create_transaction'),
|
|
595
|
+
update: recommendations.filter(r => r.action_type === 'update_cleared'),
|
|
596
|
+
review: recommendations.filter(r => r.action_type === 'manual_review'),
|
|
597
|
+
};
|
|
598
|
+
|
|
599
|
+
// Execute high-confidence creates first
|
|
600
|
+
for (const rec of groups.create.filter(r => r.confidence > 0.9)) {
|
|
601
|
+
await create_transaction({
|
|
602
|
+
budget_id: budgetId,
|
|
603
|
+
...rec.parameters
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
// Review checkpoint: verify balance improvement
|
|
608
|
+
const updatedAnalysis = await reconcile_account_v2({ ... });
|
|
609
|
+
console.log('Balance after creates:', updatedAnalysis.balance_info.discrepancy);
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
**Error Handling and Rollback**
|
|
613
|
+
|
|
614
|
+
Track executed recommendations for potential rollback:
|
|
615
|
+
|
|
616
|
+
```typescript
|
|
617
|
+
const executionLog = [];
|
|
618
|
+
|
|
619
|
+
try {
|
|
620
|
+
for (const rec of recommendations) {
|
|
621
|
+
if (rec.action_type === 'create_transaction') {
|
|
622
|
+
const result = await create_transaction({
|
|
623
|
+
budget_id: budgetId,
|
|
624
|
+
...rec.parameters
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
executionLog.push({
|
|
628
|
+
recommendation_id: rec.id,
|
|
629
|
+
transaction_id: result.transaction.id,
|
|
630
|
+
action: 'create_transaction'
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
} catch (error) {
|
|
635
|
+
// Rollback: delete created transactions
|
|
636
|
+
for (const log of executionLog.reverse()) {
|
|
637
|
+
if (log.action === 'create_transaction') {
|
|
638
|
+
await delete_transaction({
|
|
639
|
+
budget_id: budgetId,
|
|
640
|
+
transaction_id: log.transaction_id
|
|
641
|
+
});
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
throw error;
|
|
645
|
+
}
|
|
646
|
+
```
|
|
647
|
+
|
|
648
|
+
**Verification After Execution**
|
|
649
|
+
|
|
650
|
+
Always re-run reconciliation after executing recommendations to verify balance improvement:
|
|
651
|
+
|
|
652
|
+
```typescript
|
|
653
|
+
// Execute recommendations
|
|
654
|
+
await executeRecommendations(recommendations);
|
|
655
|
+
|
|
656
|
+
// Verify discrepancy resolved
|
|
657
|
+
const verifyAnalysis = await reconcile_account_v2({
|
|
658
|
+
budget_id: budgetId,
|
|
659
|
+
account_id: accountId,
|
|
660
|
+
csv_data: csvData,
|
|
661
|
+
statement_balance: statementBalance,
|
|
662
|
+
statement_date: statementDate
|
|
663
|
+
});
|
|
664
|
+
|
|
665
|
+
const beforeDiscrepancy = originalAnalysis.balance_info.discrepancy.value;
|
|
666
|
+
const afterDiscrepancy = verifyAnalysis.balance_info.discrepancy.value;
|
|
667
|
+
|
|
668
|
+
if (Math.abs(afterDiscrepancy) >= Math.abs(beforeDiscrepancy)) {
|
|
669
|
+
console.warn('Discrepancy not improved - review executed recommendations');
|
|
670
|
+
}
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
**Handling Manual Review Recommendations**
|
|
674
|
+
|
|
675
|
+
Manual review recommendations require investigation before action:
|
|
676
|
+
|
|
677
|
+
```typescript
|
|
678
|
+
for (const rec of recommendations.filter(r => r.action_type === 'manual_review')) {
|
|
679
|
+
console.log(`\n=== ${rec.message} ===`);
|
|
680
|
+
console.log(`Reason: ${rec.reason}`);
|
|
681
|
+
console.log(`Issue type: ${rec.parameters.issue_type}`);
|
|
682
|
+
|
|
683
|
+
if (rec.parameters.related_transactions) {
|
|
684
|
+
console.log('\nRelated transactions:');
|
|
685
|
+
for (const txn of rec.parameters.related_transactions) {
|
|
686
|
+
console.log(` - [${txn.source}] ${txn.description} (ID: ${txn.id})`);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
// Fetch full details for investigation
|
|
691
|
+
for (const txn of rec.parameters.related_transactions || []) {
|
|
692
|
+
if (txn.source === 'ynab') {
|
|
693
|
+
const details = await get_transaction({
|
|
694
|
+
budget_id: budgetId,
|
|
695
|
+
transaction_id: txn.id
|
|
696
|
+
});
|
|
697
|
+
console.log(` Details:`, JSON.stringify(details, null, 2));
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
}
|
|
701
|
+
```
|
|
702
|
+
|
|
703
|
+
**Progressive Execution Strategy**
|
|
704
|
+
|
|
705
|
+
For large discrepancies with many recommendations:
|
|
706
|
+
|
|
707
|
+
1. **Execute high-confidence creates** (confidence > 0.9, action_type = create_transaction)
|
|
708
|
+
2. **Re-run reconciliation** to verify progress
|
|
709
|
+
3. **Review remaining discrepancy** and adjust strategy
|
|
710
|
+
4. **Process medium-confidence items** with manual review
|
|
711
|
+
5. **Final verification** before marking account as reconciled
|
|
712
|
+
|
|
713
|
+
### get_transaction
|
|
714
|
+
|
|
715
|
+
Gets detailed information for a specific transaction.
|
|
716
|
+
|
|
717
|
+
**Parameters:**
|
|
718
|
+
- `budget_id` (string, required): The ID of the budget
|
|
719
|
+
- `transaction_id` (string, required): The ID of the transaction
|
|
720
|
+
|
|
721
|
+
**Example Request:**
|
|
722
|
+
```json
|
|
723
|
+
{
|
|
724
|
+
"name": "get_transaction",
|
|
725
|
+
"arguments": {
|
|
726
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
727
|
+
"transaction_id": "transaction-id"
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
```
|
|
731
|
+
|
|
732
|
+
### create_transaction
|
|
733
|
+
|
|
734
|
+
Creates a new transaction in the specified budget and account.
|
|
735
|
+
|
|
736
|
+
**Parameters:**
|
|
737
|
+
- `budget_id` (string, required): The ID of the budget
|
|
738
|
+
- `account_id` (string, required): The ID of the account
|
|
739
|
+
- `amount` (number, required): Transaction amount in milliunits (negative for outflows)
|
|
740
|
+
- `date` (string, required): Transaction date in ISO format (YYYY-MM-DD)
|
|
741
|
+
- `payee_name` (string, optional): The payee name
|
|
742
|
+
- `payee_id` (string, optional): The payee ID
|
|
743
|
+
- `category_id` (string, optional): The category ID
|
|
744
|
+
- `memo` (string, optional): Transaction memo
|
|
745
|
+
- `cleared` (string, optional): Transaction cleared status (`cleared`, `uncleared`, `reconciled`)
|
|
746
|
+
- `approved` (boolean, optional): Whether the transaction is approved
|
|
747
|
+
- `flag_color` (string, optional): Transaction flag color (`red`, `orange`, `yellow`, `green`, `blue`, `purple`)
|
|
748
|
+
- `dry_run` (boolean, optional): Validate and return simulated result; no API call
|
|
749
|
+
- `subtransactions` (array, optional): Split line items; each entry accepts `amount` (milliunits), plus optional `memo`, `category_id`, `payee_id`, and `payee_name`
|
|
750
|
+
|
|
751
|
+
When `subtransactions` are supplied, their `amount` values must sum to the parent `amount`, matching YNAB API requirements.
|
|
752
|
+
|
|
753
|
+
**Example Request:**
|
|
754
|
+
```json
|
|
755
|
+
{
|
|
756
|
+
"name": "create_transaction",
|
|
757
|
+
"arguments": {
|
|
758
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
759
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
760
|
+
"amount": -5000,
|
|
761
|
+
"date": "2024-01-15",
|
|
762
|
+
"payee_name": "Coffee Shop",
|
|
763
|
+
"category_id": "category-id",
|
|
764
|
+
"memo": "Morning coffee",
|
|
765
|
+
"cleared": "cleared",
|
|
766
|
+
"approved": true
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
```
|
|
770
|
+
|
|
771
|
+
**Split Transaction Example:**
|
|
772
|
+
```json
|
|
773
|
+
{
|
|
774
|
+
"name": "create_transaction",
|
|
775
|
+
"arguments": {
|
|
776
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
777
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
778
|
+
"amount": -125000,
|
|
779
|
+
"date": "2024-02-01",
|
|
780
|
+
"memo": "Rent and utilities",
|
|
781
|
+
"subtransactions": [
|
|
782
|
+
{ "amount": -100000, "category_id": "rent-category", "memo": "Rent" },
|
|
783
|
+
{ "amount": -25000, "category_id": "utilities-category", "memo": "Utilities" }
|
|
784
|
+
]
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
### create_receipt_split_transaction
|
|
790
|
+
|
|
791
|
+
Creates a split transaction from categorized receipt data and allocates taxes proportionally across the selected categories. Use this helper after the user has confirmed the receipt breakdown and category assignments.
|
|
792
|
+
|
|
793
|
+
**Parameters:**
|
|
794
|
+
- `budget_id` (string, required): The ID of the budget
|
|
795
|
+
- `account_id` (string, required): The ID of the account
|
|
796
|
+
- `payee_name` (string, required): Payee to assign to the transaction (e.g., the store name)
|
|
797
|
+
- `date` (string, optional): Transaction date in ISO format (defaults to today when omitted)
|
|
798
|
+
- `memo` (string, optional): Memo applied to the parent transaction
|
|
799
|
+
- `receipt_subtotal` (number, optional): Pre-tax subtotal for validation (calculated automatically if omitted)
|
|
800
|
+
- `receipt_tax` (number, required): Total tax collected on the receipt
|
|
801
|
+
- `receipt_total` (number, required): Final total including tax
|
|
802
|
+
- `categories` (array, required): Categorized line items. Each entry accepts:
|
|
803
|
+
- `category_id` (string, required)
|
|
804
|
+
- `category_name` (string, optional, used for tax memo labels)
|
|
805
|
+
- `items` (array, required): Each item includes `name` (string), `amount` (number), optional `quantity` (number), and optional `memo` (string)
|
|
806
|
+
- `cleared` (string, optional): Cleared status (`cleared`, `uncleared`, `reconciled`). Defaults to `uncleared`
|
|
807
|
+
- `approved` (boolean, optional): Whether the transaction should be marked approved
|
|
808
|
+
- `flag_color` (string, optional): Flag color (`red`, `orange`, `yellow`, `green`, `blue`, `purple`)
|
|
809
|
+
- `dry_run` (boolean, optional): When true, returns a preview without calling YNAB
|
|
810
|
+
|
|
811
|
+
**Example Request:**
|
|
812
|
+
```json
|
|
813
|
+
{
|
|
814
|
+
"name": "create_receipt_split_transaction",
|
|
815
|
+
"arguments": {
|
|
816
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
817
|
+
"account_id": "87654321-4321-4321-4321-210987654321",
|
|
818
|
+
"payee_name": "IKEA",
|
|
819
|
+
"date": "2025-10-13",
|
|
820
|
+
"memo": "Receipt import",
|
|
821
|
+
"receipt_subtotal": 112.34,
|
|
822
|
+
"receipt_tax": 11.84,
|
|
823
|
+
"receipt_total": 124.18,
|
|
824
|
+
"categories": [
|
|
825
|
+
{
|
|
826
|
+
"category_id": "baby-stuff",
|
|
827
|
+
"category_name": "Baby Stuff",
|
|
828
|
+
"items": [
|
|
829
|
+
{ "name": "Crib pillow", "amount": 12.99 },
|
|
830
|
+
{ "name": "Bed linen", "amount": 24.99 }
|
|
831
|
+
]
|
|
832
|
+
},
|
|
833
|
+
{
|
|
834
|
+
"category_id": "home-maintenance",
|
|
835
|
+
"category_name": "Home Maintenance",
|
|
836
|
+
"items": [
|
|
837
|
+
{ "name": "Teapot", "amount": 19.99 },
|
|
838
|
+
{ "name": "Toothbrush holder", "amount": 3.99 }
|
|
839
|
+
]
|
|
840
|
+
}
|
|
841
|
+
]
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
```
|
|
845
|
+
|
|
846
|
+
**Example Response:**
|
|
847
|
+
```json
|
|
848
|
+
{
|
|
849
|
+
"transaction": {
|
|
850
|
+
"id": "new-transaction-456",
|
|
851
|
+
"amount": -124.18,
|
|
852
|
+
"payee_name": "IKEA",
|
|
853
|
+
"cleared": "uncleared",
|
|
854
|
+
"subtransactions": [
|
|
855
|
+
{ "memo": "Crib pillow", "amount": -12.99, "category_id": "baby-stuff" },
|
|
856
|
+
{ "memo": "Bed linen", "amount": -24.99, "category_id": "baby-stuff" },
|
|
857
|
+
{ "memo": "Tax - Baby Stuff", "amount": -6.11, "category_id": "baby-stuff" },
|
|
858
|
+
{ "memo": "Teapot", "amount": -19.99, "category_id": "home-maintenance" },
|
|
859
|
+
{ "memo": "Toothbrush holder", "amount": -3.99, "category_id": "home-maintenance" },
|
|
860
|
+
{ "memo": "Tax - Home Maintenance", "amount": -5.99, "category_id": "home-maintenance" }
|
|
861
|
+
],
|
|
862
|
+
"account_balance": 2534.87,
|
|
863
|
+
"account_cleared_balance": 2450.22
|
|
864
|
+
},
|
|
865
|
+
"receipt_summary": {
|
|
866
|
+
"subtotal": 112.34,
|
|
867
|
+
"tax": 11.84,
|
|
868
|
+
"total": 124.18,
|
|
869
|
+
"categories": [
|
|
870
|
+
{
|
|
871
|
+
"category_id": "baby-stuff",
|
|
872
|
+
"category_name": "Baby Stuff",
|
|
873
|
+
"subtotal": 37.98,
|
|
874
|
+
"tax": 6.11,
|
|
875
|
+
"total": 44.09
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
"category_id": "home-maintenance",
|
|
879
|
+
"category_name": "Home Maintenance",
|
|
880
|
+
"subtotal": 74.36,
|
|
881
|
+
"tax": 5.73,
|
|
882
|
+
"total": 80.09
|
|
883
|
+
}
|
|
884
|
+
]
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
```
|
|
888
|
+
|
|
889
|
+
### update_transaction
|
|
890
|
+
|
|
891
|
+
Updates an existing transaction.
|
|
892
|
+
|
|
893
|
+
**Parameters:**
|
|
894
|
+
- `budget_id` (string, required): The ID of the budget
|
|
895
|
+
- `transaction_id` (string, required): The ID of the transaction to update
|
|
896
|
+
- `account_id` (string, optional): Update the account ID
|
|
897
|
+
- `amount` (number, optional): Update the amount in milliunits
|
|
898
|
+
- `date` (string, optional): Update the date (YYYY-MM-DD)
|
|
899
|
+
- `payee_name` (string, optional): Update the payee name
|
|
900
|
+
- `payee_id` (string, optional): Update the payee ID
|
|
901
|
+
- `category_id` (string, optional): Update the category ID
|
|
902
|
+
- `memo` (string, optional): Update the memo
|
|
903
|
+
- `cleared` (string, optional): Update the cleared status
|
|
904
|
+
- `approved` (boolean, optional): Update the approved status
|
|
905
|
+
- `flag_color` (string, optional): Update the flag color
|
|
906
|
+
- `dry_run` (boolean, optional): Validate and return simulated result; no API call
|
|
907
|
+
|
|
908
|
+
**Example Request:**
|
|
909
|
+
```json
|
|
910
|
+
{
|
|
911
|
+
"name": "update_transaction",
|
|
912
|
+
"arguments": {
|
|
913
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
914
|
+
"transaction_id": "transaction-id",
|
|
915
|
+
"amount": -6000,
|
|
916
|
+
"memo": "Updated memo",
|
|
917
|
+
"flag_color": "red"
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
```
|
|
921
|
+
|
|
922
|
+
### delete_transaction
|
|
923
|
+
|
|
924
|
+
Deletes a transaction from the specified budget.
|
|
925
|
+
|
|
926
|
+
**Parameters:**
|
|
927
|
+
- `budget_id` (string, required): The ID of the budget
|
|
928
|
+
- `transaction_id` (string, required): The ID of the transaction to delete
|
|
929
|
+
- `dry_run` (boolean, optional): Validate and return simulated result; no API call
|
|
930
|
+
|
|
931
|
+
**Example Request:**
|
|
932
|
+
```json
|
|
933
|
+
{
|
|
934
|
+
"name": "delete_transaction",
|
|
935
|
+
"arguments": {
|
|
936
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
937
|
+
"transaction_id": "transaction-id"
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
```
|
|
941
|
+
|
|
942
|
+
## Category Management Tools
|
|
943
|
+
|
|
944
|
+
### list_categories
|
|
945
|
+
|
|
946
|
+
Lists all categories for a specific budget.
|
|
947
|
+
|
|
948
|
+
**Parameters:**
|
|
949
|
+
- `budget_id` (string, required): The ID of the budget
|
|
950
|
+
|
|
951
|
+
**Example Request:**
|
|
952
|
+
```json
|
|
953
|
+
{
|
|
954
|
+
"name": "list_categories",
|
|
955
|
+
"arguments": {
|
|
956
|
+
"budget_id": "12345678-1234-1234-1234-123456789012"
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
```
|
|
960
|
+
|
|
961
|
+
**Example Response:**
|
|
962
|
+
```json
|
|
963
|
+
{
|
|
964
|
+
"content": [
|
|
965
|
+
{
|
|
966
|
+
"type": "text",
|
|
967
|
+
"text": "{\n \"category_groups\": [\n {\n \"id\": \"group-id\",\n \"name\": \"Monthly Bills\",\n \"hidden\": false,\n \"deleted\": false,\n \"categories\": [\n {\n \"id\": \"category-id\",\n \"category_group_id\": \"group-id\",\n \"name\": \"Rent/Mortgage\",\n \"hidden\": false,\n \"original_category_group_id\": null,\n \"note\": null,\n \"budgeted\": 150000,\n \"activity\": -150000,\n \"balance\": 0,\n \"goal_type\": null,\n \"goal_creation_month\": null,\n \"goal_target\": null,\n \"goal_target_month\": null,\n \"goal_percentage_complete\": null,\n \"goal_months_to_budget\": null,\n \"goal_under_funded\": null,\n \"goal_overall_funded\": null,\n \"goal_overall_left\": null,\n \"deleted\": false\n }\n ]\n }\n ]\n}"
|
|
968
|
+
}
|
|
969
|
+
]
|
|
970
|
+
}
|
|
971
|
+
```
|
|
972
|
+
|
|
973
|
+
### get_category
|
|
974
|
+
|
|
975
|
+
Gets detailed information for a specific category.
|
|
976
|
+
|
|
977
|
+
**Parameters:**
|
|
978
|
+
- `budget_id` (string, required): The ID of the budget
|
|
979
|
+
- `category_id` (string, required): The ID of the category
|
|
980
|
+
|
|
981
|
+
### update_category
|
|
982
|
+
|
|
983
|
+
Updates the budgeted amount for a category in the current month.
|
|
984
|
+
|
|
985
|
+
**Parameters:**
|
|
986
|
+
- `budget_id` (string, required): The ID of the budget
|
|
987
|
+
- `category_id` (string, required): The ID of the category
|
|
988
|
+
- `budgeted` (number, required): The budgeted amount in milliunits
|
|
989
|
+
- `dry_run` (boolean, optional): Validate and return simulated result; no API call
|
|
990
|
+
|
|
991
|
+
**Example Request:**
|
|
992
|
+
```json
|
|
993
|
+
{
|
|
994
|
+
"name": "update_category",
|
|
995
|
+
"arguments": {
|
|
996
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
997
|
+
"category_id": "category-id",
|
|
998
|
+
"budgeted": 50000
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
```
|
|
1002
|
+
|
|
1003
|
+
## Payee Management Tools
|
|
1004
|
+
|
|
1005
|
+
### list_payees
|
|
1006
|
+
|
|
1007
|
+
Lists all payees for a specific budget.
|
|
1008
|
+
|
|
1009
|
+
**Parameters:**
|
|
1010
|
+
- `budget_id` (string, required): The ID of the budget
|
|
1011
|
+
|
|
1012
|
+
**Example Request:**
|
|
1013
|
+
```json
|
|
1014
|
+
{
|
|
1015
|
+
"name": "list_payees",
|
|
1016
|
+
"arguments": {
|
|
1017
|
+
"budget_id": "12345678-1234-1234-1234-123456789012"
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
```
|
|
1021
|
+
|
|
1022
|
+
### get_payee
|
|
1023
|
+
|
|
1024
|
+
Gets detailed information for a specific payee.
|
|
1025
|
+
|
|
1026
|
+
**Parameters:**
|
|
1027
|
+
- `budget_id` (string, required): The ID of the budget
|
|
1028
|
+
- `payee_id` (string, required): The ID of the payee
|
|
1029
|
+
|
|
1030
|
+
## Monthly Data Tools
|
|
1031
|
+
|
|
1032
|
+
### get_month
|
|
1033
|
+
|
|
1034
|
+
Gets budget data for a specific month.
|
|
1035
|
+
|
|
1036
|
+
**Parameters:**
|
|
1037
|
+
- `budget_id` (string, required): The ID of the budget
|
|
1038
|
+
- `month` (string, required): The month in ISO format (YYYY-MM-DD, typically first day of month)
|
|
1039
|
+
|
|
1040
|
+
**Example Request:**
|
|
1041
|
+
```json
|
|
1042
|
+
{
|
|
1043
|
+
"name": "get_month",
|
|
1044
|
+
"arguments": {
|
|
1045
|
+
"budget_id": "12345678-1234-1234-1234-123456789012",
|
|
1046
|
+
"month": "2024-01-01"
|
|
1047
|
+
}
|
|
1048
|
+
}
|
|
1049
|
+
```
|
|
1050
|
+
|
|
1051
|
+
### list_months
|
|
1052
|
+
|
|
1053
|
+
Lists all months summary data for a budget.
|
|
1054
|
+
|
|
1055
|
+
**Parameters:**
|
|
1056
|
+
- `budget_id` (string, required): The ID of the budget
|
|
1057
|
+
|
|
1058
|
+
## Utility Tools
|
|
1059
|
+
|
|
1060
|
+
### get_user
|
|
1061
|
+
|
|
1062
|
+
Gets information about the authenticated user.
|
|
1063
|
+
|
|
1064
|
+
**Parameters:** None
|
|
1065
|
+
|
|
1066
|
+
**Example Request:**
|
|
1067
|
+
```json
|
|
1068
|
+
{
|
|
1069
|
+
"name": "get_user",
|
|
1070
|
+
"arguments": {}
|
|
1071
|
+
}
|
|
1072
|
+
```
|
|
1073
|
+
|
|
1074
|
+
**Example Response:**
|
|
1075
|
+
```json
|
|
1076
|
+
{
|
|
1077
|
+
"content": [
|
|
1078
|
+
{
|
|
1079
|
+
"type": "text",
|
|
1080
|
+
"text": "{\n \"user\": {\n \"id\": \"user-id\",\n \"email\": \"user@example.com\",\n \"trial_expires_on\": null,\n \"subscription\": {\n \"trial_expires_on\": null,\n \"cancelled_at\": null,\n \"date_first_current\": \"2020-01-01T00:00:00.000Z\",\n \"frequency\": \"annually\"\n }\n }\n}"
|
|
1081
|
+
}
|
|
1082
|
+
]
|
|
1083
|
+
}
|
|
1084
|
+
```
|
|
1085
|
+
|
|
1086
|
+
### convert_amount
|
|
1087
|
+
|
|
1088
|
+
Converts between dollars and milliunits with integer arithmetic for precision.
|
|
1089
|
+
|
|
1090
|
+
**Parameters:**
|
|
1091
|
+
- `amount` (number, required): The amount to convert
|
|
1092
|
+
- `to_milliunits` (boolean, required): If true, convert from dollars to milliunits. If false, convert from milliunits to dollars
|
|
1093
|
+
|
|
1094
|
+
**Example Request (dollars to milliunits):**
|
|
1095
|
+
```json
|
|
1096
|
+
{
|
|
1097
|
+
"name": "convert_amount",
|
|
1098
|
+
"arguments": {
|
|
1099
|
+
"amount": 50.25,
|
|
1100
|
+
"to_milliunits": true
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
```
|
|
1104
|
+
|
|
1105
|
+
**Example Response:**
|
|
1106
|
+
```json
|
|
1107
|
+
{
|
|
1108
|
+
"content": [
|
|
1109
|
+
{
|
|
1110
|
+
"type": "text",
|
|
1111
|
+
"text": "{\n \"original_amount\": 50.25,\n \"converted_amount\": 50250,\n \"conversion_type\": \"dollars_to_milliunits\"\n}"
|
|
1112
|
+
}
|
|
1113
|
+
]
|
|
1114
|
+
}
|
|
1115
|
+
```
|
|
1116
|
+
|
|
1117
|
+
**Example Request (milliunits to dollars):**
|
|
1118
|
+
```json
|
|
1119
|
+
{
|
|
1120
|
+
"name": "convert_amount",
|
|
1121
|
+
"arguments": {
|
|
1122
|
+
"amount": 50250,
|
|
1123
|
+
"to_milliunits": false
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
```
|
|
1127
|
+
|
|
1128
|
+
**Example Response:**
|
|
1129
|
+
```json
|
|
1130
|
+
{
|
|
1131
|
+
"content": [
|
|
1132
|
+
{
|
|
1133
|
+
"type": "text",
|
|
1134
|
+
"text": "{\n \"original_amount\": 50250,\n \"converted_amount\": 50.25,\n \"conversion_type\": \"milliunits_to_dollars\"\n}"
|
|
1135
|
+
}
|
|
1136
|
+
]
|
|
1137
|
+
}
|
|
1138
|
+
```
|
|
1139
|
+
|
|
1140
|
+
## Diagnostic Tools
|
|
1141
|
+
|
|
1142
|
+
These tools help inspect the server, environment, and performance. They do not modify YNAB data.
|
|
1143
|
+
|
|
1144
|
+
### diagnostic_info
|
|
1145
|
+
|
|
1146
|
+
Returns comprehensive diagnostic information about the MCP server with flexible parameter control.
|
|
1147
|
+
|
|
1148
|
+
**Parameters:**
|
|
1149
|
+
- `include_memory` (boolean, optional): Include memory usage statistics (default: true)
|
|
1150
|
+
- `include_environment` (boolean, optional): Include environment and token status (default: true)
|
|
1151
|
+
- `include_server` (boolean, optional): Include server version and runtime info (default: true)
|
|
1152
|
+
- `include_security` (boolean, optional): Include security and rate limiting stats (default: true)
|
|
1153
|
+
- `include_cache` (boolean, optional): Include cache statistics (default: true)
|
|
1154
|
+
|
|
1155
|
+
**Example Request (all sections):**
|
|
1156
|
+
```json
|
|
1157
|
+
{
|
|
1158
|
+
"name": "diagnostic_info",
|
|
1159
|
+
"arguments": {}
|
|
1160
|
+
}
|
|
1161
|
+
```
|
|
1162
|
+
|
|
1163
|
+
**Example Request (selective sections):**
|
|
1164
|
+
```json
|
|
1165
|
+
{
|
|
1166
|
+
"name": "diagnostic_info",
|
|
1167
|
+
"arguments": {
|
|
1168
|
+
"include_memory": true,
|
|
1169
|
+
"include_server": true,
|
|
1170
|
+
"include_security": false,
|
|
1171
|
+
"include_cache": false,
|
|
1172
|
+
"include_environment": false
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
```
|
|
1176
|
+
|
|
1177
|
+
**Example Response:**
|
|
1178
|
+
```json
|
|
1179
|
+
{
|
|
1180
|
+
"content": [
|
|
1181
|
+
{
|
|
1182
|
+
"type": "text",
|
|
1183
|
+
"text": "{\n \"timestamp\": \"2024-01-15T10:30:00.000Z\",\n \"server\": {\n \"name\": \"ynab-mcp-server\",\n \"version\": \"0.6.0\",\n \"node_version\": \"v20.10.0\",\n \"platform\": \"win32\",\n \"arch\": \"x64\",\n \"pid\": 12345,\n \"uptime_ms\": 3600000,\n \"uptime_readable\": \"1h 0m 0s\",\n \"env\": {\n \"node_env\": \"development\",\n \"minify_output\": \"true\"\n }\n },\n \"memory\": {\n \"rss_mb\": 45.2,\n \"heap_used_mb\": 32.1,\n \"heap_total_mb\": 40.5,\n \"external_mb\": 2.1,\n \"array_buffers_mb\": 0.5,\n \"description\": {\n \"rss\": \"Resident Set Size - total memory allocated for the process\",\n \"heap_used\": \"Used heap memory (objects, closures, etc.)\",\n \"heap_total\": \"Total heap memory allocated\",\n \"external\": \"Memory used by C++ objects bound to JavaScript objects\",\n \"array_buffers\": \"Memory allocated for ArrayBuffer and SharedArrayBuffer\"\n }\n },\n \"environment\": {\n \"token_present\": true,\n \"token_length\": 64,\n \"token_preview\": \"abcd...xyz\",\n \"ynab_env_keys_present\": [\"YNAB_ACCESS_TOKEN\"],\n \"working_directory\": \"/path/to/project\"\n },\n \"security\": {\n \"requests_processed\": 1250,\n \"rate_limit_hits\": 0,\n \"errors_logged\": 2\n },\n \"cache\": {\n \"entries\": 15,\n \"estimated_size_kb\": 128,\n \"keys\": [\"budget_123\", \"account_456\"]\n }\n}"
|
|
1184
|
+
}
|
|
1185
|
+
]
|
|
1186
|
+
}
|
|
1187
|
+
```
|
|
1188
|
+
|
|
1189
|
+
### clear_cache
|
|
1190
|
+
|
|
1191
|
+
Clears the in-memory cache. Safe; does not modify YNAB data.
|
|
1192
|
+
|
|
1193
|
+
**Parameters:** None
|
|
1194
|
+
|
|
1195
|
+
Example Request:
|
|
1196
|
+
```json
|
|
1197
|
+
{ "name": "clear_cache", "arguments": {} }
|
|
1198
|
+
```
|
|
1199
|
+
|
|
1200
|
+
### set_output_format
|
|
1201
|
+
|
|
1202
|
+
Configures default JSON formatting for responses.
|
|
1203
|
+
|
|
1204
|
+
Parameters:
|
|
1205
|
+
- `default_minify` (boolean, optional): Minify JSON outputs by default (default: true)
|
|
1206
|
+
- `pretty_spaces` (number, optional): Spaces to use when pretty-printing (0-10)
|
|
1207
|
+
|
|
1208
|
+
Example Request:
|
|
1209
|
+
```json
|
|
1210
|
+
{ "name": "set_output_format", "arguments": { "default_minify": false, "pretty_spaces": 2 } }
|
|
1211
|
+
```
|
|
1212
|
+
|
|
1213
|
+
## Error Handling
|
|
1214
|
+
|
|
1215
|
+
All tools implement comprehensive error handling with consistent error response formats.
|
|
1216
|
+
|
|
1217
|
+
### Error Response Format
|
|
1218
|
+
|
|
1219
|
+
```json
|
|
1220
|
+
{
|
|
1221
|
+
"content": [
|
|
1222
|
+
{
|
|
1223
|
+
"type": "text",
|
|
1224
|
+
"text": "{\n \"error\": {\n \"code\": \"ERROR_CODE\",\n \"message\": \"Human-readable error message\",\n \"tool\": \"tool_name\",\n \"operation\": \"operation_description\"\n }\n}"
|
|
1225
|
+
}
|
|
1226
|
+
]
|
|
1227
|
+
}
|
|
1228
|
+
```
|
|
1229
|
+
|
|
1230
|
+
### Common Error Types
|
|
1231
|
+
|
|
1232
|
+
#### Authentication Errors (401)
|
|
1233
|
+
|
|
1234
|
+
**Cause**: Invalid or expired YNAB access token
|
|
1235
|
+
|
|
1236
|
+
**Example Response:**
|
|
1237
|
+
```json
|
|
1238
|
+
{
|
|
1239
|
+
"error": {
|
|
1240
|
+
"code": "AUTHENTICATION_ERROR",
|
|
1241
|
+
"message": "Invalid or expired YNAB access token. Please check your YNAB_ACCESS_TOKEN environment variable.",
|
|
1242
|
+
"tool": "list_budgets",
|
|
1243
|
+
"operation": "listing budgets"
|
|
1244
|
+
}
|
|
1245
|
+
}
|
|
1246
|
+
```
|
|
1247
|
+
|
|
1248
|
+
**Solutions:**
|
|
1249
|
+
- Verify the `YNAB_ACCESS_TOKEN` environment variable is set correctly
|
|
1250
|
+
- Check if the token has expired in YNAB Developer Settings
|
|
1251
|
+
- Generate a new token if necessary
|
|
1252
|
+
|
|
1253
|
+
#### Authorization Errors (403)
|
|
1254
|
+
|
|
1255
|
+
**Cause**: Insufficient permissions for the requested operation
|
|
1256
|
+
|
|
1257
|
+
**Example Response:**
|
|
1258
|
+
```json
|
|
1259
|
+
{
|
|
1260
|
+
"error": {
|
|
1261
|
+
"code": "AUTHORIZATION_ERROR",
|
|
1262
|
+
"message": "Insufficient permissions to access this resource.",
|
|
1263
|
+
"tool": "get_budget",
|
|
1264
|
+
"operation": "retrieving budget details"
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
```
|
|
1268
|
+
|
|
1269
|
+
#### Resource Not Found (404)
|
|
1270
|
+
|
|
1271
|
+
**Cause**: Invalid budget_id, account_id, transaction_id, etc.
|
|
1272
|
+
|
|
1273
|
+
**Example Response:**
|
|
1274
|
+
```json
|
|
1275
|
+
{
|
|
1276
|
+
"error": {
|
|
1277
|
+
"code": "RESOURCE_NOT_FOUND",
|
|
1278
|
+
"message": "The requested resource was not found. Please verify the ID is correct.",
|
|
1279
|
+
"tool": "get_account",
|
|
1280
|
+
"operation": "retrieving account details"
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
```
|
|
1284
|
+
|
|
1285
|
+
**Solutions:**
|
|
1286
|
+
- Verify the ID is correct and exists
|
|
1287
|
+
- Use list operations to find valid IDs
|
|
1288
|
+
- Check if the resource has been deleted
|
|
1289
|
+
|
|
1290
|
+
#### Rate Limiting (429)
|
|
1291
|
+
|
|
1292
|
+
**Cause**: Too many requests to YNAB API
|
|
1293
|
+
|
|
1294
|
+
**Example Response:**
|
|
1295
|
+
```json
|
|
1296
|
+
{
|
|
1297
|
+
"error": {
|
|
1298
|
+
"code": "RATE_LIMIT_EXCEEDED",
|
|
1299
|
+
"message": "Rate limit exceeded. Please wait before making more requests.",
|
|
1300
|
+
"tool": "list_transactions",
|
|
1301
|
+
"operation": "listing transactions"
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
```
|
|
1305
|
+
|
|
1306
|
+
**Solutions:**
|
|
1307
|
+
- Wait before making additional requests
|
|
1308
|
+
- Implement exponential backoff in your client
|
|
1309
|
+
- Reduce the frequency of API calls
|
|
1310
|
+
|
|
1311
|
+
#### Validation Errors
|
|
1312
|
+
|
|
1313
|
+
**Cause**: Invalid parameters provided to tools
|
|
1314
|
+
|
|
1315
|
+
**Example Response:**
|
|
1316
|
+
```json
|
|
1317
|
+
{
|
|
1318
|
+
"error": {
|
|
1319
|
+
"code": "VALIDATION_ERROR",
|
|
1320
|
+
"message": "Invalid parameters: date must be in ISO format (YYYY-MM-DD)",
|
|
1321
|
+
"tool": "create_transaction",
|
|
1322
|
+
"operation": "creating transaction"
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
```
|
|
1326
|
+
|
|
1327
|
+
**Solutions:**
|
|
1328
|
+
- Check parameter formats and types
|
|
1329
|
+
- Refer to the tool documentation for valid values
|
|
1330
|
+
- Ensure required parameters are provided
|
|
1331
|
+
|
|
1332
|
+
#### Server Errors (500)
|
|
1333
|
+
|
|
1334
|
+
**Cause**: YNAB service issues or internal server errors
|
|
1335
|
+
|
|
1336
|
+
**Example Response:**
|
|
1337
|
+
```json
|
|
1338
|
+
{
|
|
1339
|
+
"error": {
|
|
1340
|
+
"code": "SERVER_ERROR",
|
|
1341
|
+
"message": "An internal server error occurred. Please try again later.",
|
|
1342
|
+
"tool": "get_budget",
|
|
1343
|
+
"operation": "retrieving budget details"
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
```
|
|
1347
|
+
|
|
1348
|
+
**Solutions:**
|
|
1349
|
+
- Retry the request after a short delay
|
|
1350
|
+
- Check YNAB service status
|
|
1351
|
+
- Contact support if the issue persists
|
|
1352
|
+
|
|
1353
|
+
## Best Practices
|
|
1354
|
+
|
|
1355
|
+
### 1. Error Handling
|
|
1356
|
+
|
|
1357
|
+
Always handle errors gracefully in your client applications:
|
|
1358
|
+
|
|
1359
|
+
```javascript
|
|
1360
|
+
try {
|
|
1361
|
+
const result = await mcpClient.callTool('list_budgets', {});
|
|
1362
|
+
// Process successful result
|
|
1363
|
+
} catch (error) {
|
|
1364
|
+
// Handle error based on error code
|
|
1365
|
+
if (error.code === 'AUTHENTICATION_ERROR') {
|
|
1366
|
+
// Prompt user to update token
|
|
1367
|
+
} else if (error.code === 'RATE_LIMIT_EXCEEDED') {
|
|
1368
|
+
// Implement retry with backoff
|
|
1369
|
+
}
|
|
1370
|
+
}
|
|
1371
|
+
```
|
|
1372
|
+
|
|
1373
|
+
### 2. Parameter Validation
|
|
1374
|
+
|
|
1375
|
+
Validate parameters before making tool calls:
|
|
1376
|
+
|
|
1377
|
+
```javascript
|
|
1378
|
+
// Validate date format
|
|
1379
|
+
const dateRegex = /^\d{4}-\d{2}-\d{2}$/;
|
|
1380
|
+
if (!dateRegex.test(date)) {
|
|
1381
|
+
throw new Error('Date must be in YYYY-MM-DD format');
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
// Validate amount is in milliunits
|
|
1385
|
+
if (!Number.isInteger(amount)) {
|
|
1386
|
+
throw new Error('Amount must be an integer in milliunits');
|
|
1387
|
+
}
|
|
1388
|
+
```
|
|
1389
|
+
|
|
1390
|
+
### 3. Efficient Data Retrieval
|
|
1391
|
+
|
|
1392
|
+
Use filtering parameters to reduce data transfer:
|
|
1393
|
+
|
|
1394
|
+
```javascript
|
|
1395
|
+
// Instead of getting all transactions and filtering client-side
|
|
1396
|
+
const allTransactions = await mcpClient.callTool('list_transactions', {
|
|
1397
|
+
budget_id: budgetId
|
|
1398
|
+
});
|
|
1399
|
+
|
|
1400
|
+
// Use server-side filtering
|
|
1401
|
+
const recentTransactions = await mcpClient.callTool('list_transactions', {
|
|
1402
|
+
budget_id: budgetId,
|
|
1403
|
+
since_date: '2024-01-01',
|
|
1404
|
+
account_id: specificAccountId
|
|
1405
|
+
});
|
|
1406
|
+
```
|
|
1407
|
+
|
|
1408
|
+
### 4. Amount Conversions
|
|
1409
|
+
|
|
1410
|
+
Use the conversion utility for user-friendly displays:
|
|
1411
|
+
|
|
1412
|
+
```javascript
|
|
1413
|
+
// Convert milliunits to dollars for display
|
|
1414
|
+
const dollarsResult = await mcpClient.callTool('convert_amount', {
|
|
1415
|
+
amount: 50250,
|
|
1416
|
+
to_milliunits: false
|
|
1417
|
+
});
|
|
1418
|
+
console.log(`Amount: $${dollarsResult.converted_amount}`); // Amount: $50.25
|
|
1419
|
+
|
|
1420
|
+
// Convert user input to milliunits for API calls
|
|
1421
|
+
const milliUnitsResult = await mcpClient.callTool('convert_amount', {
|
|
1422
|
+
amount: 50.25,
|
|
1423
|
+
to_milliunits: true
|
|
1424
|
+
});
|
|
1425
|
+
// Use milliUnitsResult.converted_amount in transaction creation
|
|
1426
|
+
```
|
|
1427
|
+
|
|
1428
|
+
### 5. Caching Strategies
|
|
1429
|
+
|
|
1430
|
+
Cache relatively static data to improve performance:
|
|
1431
|
+
|
|
1432
|
+
```javascript
|
|
1433
|
+
// Cache budget and account information
|
|
1434
|
+
const budgets = await mcpClient.callTool('list_budgets', {});
|
|
1435
|
+
// Cache for 1 hour
|
|
1436
|
+
|
|
1437
|
+
const accounts = await mcpClient.callTool('list_accounts', {
|
|
1438
|
+
budget_id: budgetId
|
|
1439
|
+
});
|
|
1440
|
+
// Cache for 30 minutes
|
|
1441
|
+
|
|
1442
|
+
// Don't cache frequently changing data like transactions
|
|
1443
|
+
const transactions = await mcpClient.callTool('list_transactions', {
|
|
1444
|
+
budget_id: budgetId,
|
|
1445
|
+
since_date: today
|
|
1446
|
+
});
|
|
1447
|
+
// Always fetch fresh
|
|
1448
|
+
```
|
|
1449
|
+
|
|
1450
|
+
This API reference provides comprehensive documentation for all available tools. For additional information, see the [Developer Guide](DEVELOPER.md) for best practices and common usage patterns.
|