{"_id":"ynab-mcp-server","_rev":"15-22fce9e35a93b4c0b0bde0171e1bffba","name":"ynab-mcp-server","dist-tags":{"latest":"0.9.0"},"versions":{"0.1.0":{"name":"ynab-mcp-server","version":"0.1.0","author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"_id":"ynab-mcp-server@0.1.0","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"2dc7bf056f6cb8da92d0369e1d1230042c7f95ad","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.1.0.tgz","fileCount":8,"integrity":"sha512-E9ZyDAqGiR98u64R3cUCnGXQzM2B2EBT/dz641ryz7VdFqJU1Xq+UDpztR/W1VxHdSPJCSqIp6weM0KaWXS2Rw==","signatures":[{"sig":"MEUCIQDRWGJ58Gi2kudMVbSizihrrU6tcxheR85UOEVtd/DQ7QIgBNo8AkSpduyct3MKEc3g3J5wTRBcmGTFatfrCIER3dM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20345},"type":"module","gitHead":"123375457cb8a3c7cdfcc5756b211a75bff8e686","scripts":{"test":"vitest","build":"tsc && mcp-build && chmod +x dist/index.js","debug":"npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"calebl","email":"caleb.lenoir@hey.com"},"_npmVersion":"10.5.1","description":"ynab-mcp-server MCP server","directories":{},"_nodeVersion":"22.0.0","dependencies":{"ynab":"^2.9.0","axios":"^1.8.4","@types/axios":"^0.14.4","mcp-framework":"^0.1.29"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.4.0","typescript":"^5.3.3","@types/node":"^20.11.24","@vitest/coverage-v8":"^1.4.0"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.1.0_1744121764790_0.4569427273655404","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"ynab-mcp-server","version":"0.1.1","author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"_id":"ynab-mcp-server@0.1.1","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"35ae4047917bc0fb99c13d4db77b6ee0fad17505","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.1.1.tgz","fileCount":8,"integrity":"sha512-Edp331zDisEmgRZakZ9x+PkJD6vxn1Q7F87dZEHQb8mpNfNQr3s3PG9nD6MHTFMH2laXJ0ClFuSm3oAIAm+thw==","signatures":[{"sig":"MEUCIFgEevsL0VrPDgkKmL5l89mvY5sxA103+I+UigTVxtUzAiEAr5tl1pCA9nLJYX/dHOErvXelqzCJjsjc/DPzkbshzl4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20373},"type":"module","gitHead":"62a5a4ad679b0c284de8e770bf72fc06f232248d","scripts":{"test":"vitest","build":"tsc && mcp-build && chmod +x dist/index.js","debug":"npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"calebl","email":"caleb.lenoir@hey.com"},"_npmVersion":"10.5.1","description":"ynab-mcp-server MCP server","directories":{},"_nodeVersion":"22.0.0","dependencies":{"ynab":"^2.9.0","axios":"^1.8.4","@types/axios":"^0.14.4","mcp-framework":"^0.1.29"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.4.0","typescript":"^5.3.3","@types/node":"^20.11.24","@vitest/coverage-v8":"^1.4.0"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.1.1_1744122187002_0.0066252848633097106","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"ynab-mcp-server","version":"0.1.2","author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"_id":"ynab-mcp-server@0.1.2","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"5332c0f96ed35becf733be57a4a82dbde0de24d7","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.1.2.tgz","fileCount":9,"integrity":"sha512-Wq2RtmIXhcKEgX9As/OHI7kjFuFZQBIbfjghWJFbGKiQ+qQbx1fUjp/tZjX7j5yxm57C7Vp0A7moL+lkssInlw==","signatures":[{"sig":"MEUCIEoaG1Ndb/XkJJP4TvvmU7SjEWUfXj932iDt+e3c8eSCAiEAqpfgWIbxlMG8jga1gcO4o/NBO/BS/6D8N/UrvJmMD4E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":23681},"type":"module","gitHead":"5263f10c28bfef07136c5157ef7cffdd9c26e4db","scripts":{"test":"vitest","build":"tsc && mcp-build && chmod +x dist/index.js","debug":"npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","prepare":"npm run build","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"calebl","email":"caleb.lenoir@hey.com"},"_npmVersion":"10.5.1","description":"ynab-mcp-server MCP server","directories":{},"_nodeVersion":"22.0.0","dependencies":{"ynab":"^2.9.0","axios":"^1.8.4","@types/axios":"^0.14.4","mcp-framework":"^0.1.29"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^1.4.0","typescript":"^5.3.3","@types/node":"^20.11.24","@vitest/coverage-v8":"^1.4.0"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.1.2_1745246613305_0.2249620996714996","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"ynab-mcp-server","version":"0.2.0","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.2.0","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"name":"ianthebeard","email":"beardedaudio@gmail.com"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"eebf54b8f39f855ca9593478b15ddf3f9635f65c","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.2.0.tgz","fileCount":31,"integrity":"sha512-tLjjaxOgyuP15Ox6gbrCRT+B0gUgPSuXrEamxMVnLPTyl6Sc1aJqskf44D/5lgwBjad7yi41m+hREZm1hNqkYw==","signatures":[{"sig":"MEUCIQCIe7Hmb7o0E0wMsQaRmdcjbg4rJDAE+GGNa79js5sszQIgIQdYmhwjq4TEMWabBudni+awK6DLqTV9w631lncxJs8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":92823},"type":"module","engines":{"node":">=22"},"gitHead":"4171f0cbd016f2017d57d965310fb81ddfb8d49e","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for interacting with a YNAB budget","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","ynab":"^2.9.0","@modelcontextprotocol/sdk":"^1.30.0","@modelcontextprotocol/server":"^2.0.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^20.11.24","@vitest/coverage-v8":"^3.2.4","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"^0.16.5"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.2.0_1789654805009_0.6941486195531283","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"ynab-mcp-server","version":"0.2.1","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.2.1","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"abb897c6437854b4813b801c762ba9d44ab6fc0d","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.2.1.tgz","fileCount":31,"integrity":"sha512-Oqxwg6v+mqBd4/8wR9DX5IZe+MMNohs2VDmLwfqQ21ysjUh5Sg3jwfqRUFNPRK4RE22GfKP6afhf71hRcdynag==","signatures":[{"sig":"MEQCIH5Vl3P/+fzUk/UnuMvZz9jd3sXpWGRQSmo9Rr/WewiSAiA9mtf5bKmTZNEAO8Wf7ROUYTt/iOxJylz4+sVEJFhlng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":93070},"type":"module","engines":{"node":">=22"},"gitHead":"7b6a22604d235d1da649b522c09be0e9d1d40a48","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for interacting with a YNAB budget","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","ynab":"^2.9.0","@modelcontextprotocol/sdk":"^1.30.0","@modelcontextprotocol/server":"^2.0.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^3.2.4","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"^0.16.5"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.2.1_1789671215928_0.7531275849620478","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"ynab-mcp-server","version":"0.3.0","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.3.0","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"75fd50c713fd2eb239c7d6b352c8d24cd108eda3","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.3.0.tgz","fileCount":33,"integrity":"sha512-EKfeSNJK1R330fCbJVOJM3Uwoq0JdwivDqdf1P4w7GRAtSp3WrQ2+SlPiMMSg5O1B4bJxsWDJPuL+jYYvIfMRA==","signatures":[{"sig":"MEYCIQCRSh6yKiY7Q1e8ZXzS2UO8ycky3uS4bg7tKFIOitAAHgIhAMFqz9OVf/pn3R44VsCqTMWZJDNDLVTsZq48box5kpy2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":134727},"type":"module","engines":{"node":">=22"},"gitHead":"483b4af134dad9b279a239864484f567149c2da7","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"oidc:74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.19.1","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.30.0","@modelcontextprotocol/server":"^2.0.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^3.2.4","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.3.0_1790087655844_0.5120884224706757","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"ynab-mcp-server","version":"0.4.0","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.4.0","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"693d09a388ba1e8c045dd613352883f6027dd9c4","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.4.0.tgz","fileCount":34,"integrity":"sha512-q3A1fq3xX22exvr0CwFEG/oQG7wc/8ymz06sjX3QJOF2f5GNuSdQkk7ieH+r1vfx4ipuMoDhrPhg2midriBlRQ==","signatures":[{"sig":"MEUCID1Av6VS7DPWajy35XJrYWNLafEqtNo0x+Vi9K7ICQ6PAiEAtb1M6tI2k4bWYNXps6+gl+pLTQTPHTZeWYszD6Cu2GE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":147101},"type":"module","engines":{"node":">=22"},"gitHead":"fb337c01064d3e8a2046bb9d8c7cbd56361c0659","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.0","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.30.0","@modelcontextprotocol/server":"^2.0.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.4","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^3.2.4","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.4.0_1790945462143_0.13850017981127527","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"ynab-mcp-server","version":"0.4.1","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.4.1","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"07d12e866385d0ec49325c867f225898b383f2ac","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.4.1.tgz","fileCount":34,"integrity":"sha512-7t5/qq78YIvo09bdOlz2NDq1iZOx6OUXUGgv+qVS1t4kDJqQ1oeVyAqwK8nc7asJ/pyGWC1AzHZ1O8f1DNPsMQ==","signatures":[{"sig":"MEUCIGT8ScSETzjsyrGI1PeUWODret/6nvpBVyM6yE+l3cRBAiEA/ELXeO+KNEYJ9+w214fgVnjTQHeT/PORO/tv2wntrMI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.4.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":151480},"type":"module","engines":{"node":"^22 || >=24"},"gitHead":"5f9f14097aa968580348e62692c55d8d18882e14","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.0","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.30.0","@modelcontextprotocol/server":"^2.0.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.4.1_1791167098395_0.015617370975329337","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"ynab-mcp-server","version":"0.4.2","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.4.2","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"b1ea6dbafd44a7585062c452b258bf67d23741a3","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.4.2.tgz","fileCount":34,"integrity":"sha512-vwnvOjdbmPmauJbAeUP7DveK2mjEigoP+eihDg47ZTdRLVdmzaeMfh2wZPLy054ZIZDjcURJkwOTmBWtVwJ2Gw==","signatures":[{"sig":"MEYCIQC2sFS4q1ZPaB2kNdv8SpFrXGmg47RFfCLFq8MJdzGP3AIhAPcCTeGkopuzEY2Cc5Ed5D0DAoHp8tjNaRbqdV7abCa8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.4.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":158918},"type":"module","engines":{"node":"^22 || >=24"},"gitHead":"57bc3ef4caf5cbe0012963edb9173c22fdd12c0b","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.0","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.30.0","@modelcontextprotocol/server":"^2.0.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.4.2_1792030749564_0.2839715999984369","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"ynab-mcp-server","version":"0.5.0","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.5.0","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"2b543ce3ca6bc8f0b194129f264161f8b3603f9d","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.5.0.tgz","fileCount":35,"integrity":"sha512-AwpXp1j8of8kl0AquhIVFon5M0J7aeNOZhsDQt8b2sgta7oVmaMW9qeh5hb0YUhrdtT6g8JuuDSwjlIEHIofiA==","signatures":[{"sig":"MEUCIQClFfg2gOxZZzHlZj6YbPk9fwZIhk+/2ZJ+d+XY7raEkgIgL3SUGHSkn2B2qij5pTR+pCw6qzzyWxkfpzeVoBn/Jm0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":175799},"type":"module","engines":{"node":"^22 || >=24"},"gitHead":"6aa78134287877ffe5ebcd8679ae42fc47ea1108","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.1","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.32.1","@modelcontextprotocol/server":"^2.0.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.5.0_1792417455827_0.9482832663140084","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"ynab-mcp-server","version":"0.6.0","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.6.0","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"b034900966ef09c054e36b1259dd874f9683dfb7","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.6.0.tgz","fileCount":33,"integrity":"sha512-LPfJeLem2QIAyuHoVDqUbAzMf4pQPVay5Wt8g/n7QpEL2yCkBcGEJgHyIerABEZb3qn4BIISws6h/tCFJcyuGw==","signatures":[{"sig":"MEUCIQDSOW7KUGaDJ/AymGvKWDXhrqxVUItgoDrkHff9rAmA7gIgbnlv6bCgAklZvBf714oOsffEqEU4BQqEIjHQ3PlUm/c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":180694},"type":"module","engines":{"node":"^22 || >=24"},"gitHead":"ea7cdf9e24baac42c02745d9f5d42b325136f279","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.1","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.32.1","@modelcontextprotocol/server":"^2.3.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.6.0_1792592424589_0.7569412224679071","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"ynab-mcp-server","version":"0.7.1","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.7.1","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"bc0e7970592df5ab3e04b89903239ce08a0cfc02","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.7.1.tgz","fileCount":36,"integrity":"sha512-vbi56s33WnF812Jpu4w1/8liUIijTPYBTbdldOMTITUXUvAlqO/yTgpwmPf/18rUcfhtN0an2Qc0xFi4LsjfTA==","signatures":[{"sig":"MEYCIQDcJY/vvFl7bpEqAHoR9d6HWdQlM5nxvv09goC3Oo3opgIhAK6O3TQSJDFwm2eWMLm69CWykwEEoppI/+g5BKhS59gm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":216553},"type":"module","engines":{"node":"^22 || >=24"},"gitHead":"f67dbd37d29e33a0604d1e561964eb32c4df2197","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.1","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.3","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.32.1","@modelcontextprotocol/server":"^2.3.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.7.1_1793067431262_0.32484150485384977","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"ynab-mcp-server","version":"0.7.2","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.7.2","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"bd226c774370bcc6ba741b183654bd45871d70d1","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.7.2.tgz","fileCount":36,"integrity":"sha512-i43pS7WPFpGVmU+WvmaTKm2NAjFidU7dZy2zFrJputano2+zxYuIxe/kKji+YavpYVmzNAXWK3wiqJAC9YygoA==","signatures":[{"sig":"MEYCIQCuRiuzL9Tu0VOcjGMGrva95sXnqBWneDl6RZhBrSM0HAIhAMkxWu+LwZv1pkVPTmr1AQ9/bBdp4c4BXOiwM5gqbMsH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":216774},"type":"module","engines":{"node":"^22 || >=24"},"gitHead":"16dd9b28271f1711ea9320f4c051f94396275677","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.1","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.4","dependencies":{"zod":"^4.5.4","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.32.1","@modelcontextprotocol/server":"^2.3.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.7.2_1793531841839_0.617411729689842","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"ynab-mcp-server","version":"0.8.0","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","_id":"ynab-mcp-server@0.8.0","maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"homepage":"https://github.com/calebl/ynab-mcp-server#readme","bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"bin":{"ynab-mcp-server":"dist/index.js"},"dist":{"shasum":"ace7f58b9960c4488a07174cd94f00724f3e4bff","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.8.0.tgz","fileCount":36,"integrity":"sha512-+ZOET/zLI00yj9GkG7YyEE3PFIui3oqrWjmqCdM5PYBwUWSxcYvf0ij0QxSzU/BJIePGQfvWWnahww/gDR51yQ==","signatures":[{"sig":"MEYCIQDsz4UM04x+GY8ylz0ku1BCCxTyvgr6qjwFpxKEIfN9MwIhAPAusBChqtbGI3/uF6ACVhAUiWQ7ofZ9kTVcNRaMeF/Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":218014},"type":"module","engines":{"node":"^22 || >=24"},"gitHead":"3e55f74e347f47a83815ef1c68cacd6fb34ffd44","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","approver":{"name":"calebl","email":"caleb.lenoir@hey.com"},"trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"}},"overrides":{"undici":"^7.30.1"},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.1","description":"MCP server for interacting with a YNAB plan","directories":{},"_nodeVersion":"22.23.4","dependencies":{"zod":"^4.5.4","jose":"^6.2.14","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.32.1","@modelcontextprotocol/server":"^2.3.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"tmp":"tmp/ynab-mcp-server_0.8.0_1793640524730_0.5847600332923957","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"_id":"ynab-mcp-server@0.9.0","bin":{"ynab-mcp-server":"dist/index.js","ynab-mcp-server-http":"dist/http.js"},"bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"dist":{"shasum":"94bb43e95be7cad5e0c163fa3e46323308b5f337","tarball":"https://registry.npmjs.org/ynab-mcp-server/-/ynab-mcp-server-0.9.0.tgz","integrity":"sha512-YtGW5HmpvUQyL4wLjnzqTcSgjeCSwsWew3ZYnCpTlPV2wbvwRT1pfyDBXOfIIuXkbMYaUExYdYvMSXPSJqBNYw==","fileCount":38,"unpackedSize":231344,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/ynab-mcp-server@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHv550N71Y7B8BlnnJBYGmrNoAOhTTjbNYx55nOUhjAUAiEApzOic2HDsACttk5xLw83E6yKCMF6Luasj2M5V6gFgxg="}]},"name":"ynab-mcp-server","type":"module","author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"engines":{"node":"^22 || >=24"},"gitHead":"237da34919d4da995aaaf214c083625b369c6b3f","license":"MIT","scripts":{"test":"vitest","build":"tsc && chmod +x dist/index.js dist/http.js","debug":"npm run build && npx @modelcontextprotocol/inspector dist/index.js","start":"node dist/index.js","watch":"tsc --watch","deploy":"wrangler deploy","prepare":"npm run build","test:run":"vitest run","cf-access":"node scripts/cloudflare-access.mjs","typecheck":"tsc --noEmit && tsc -p tsconfig.worker.json","dev:worker":"wrangler dev","start:http":"node dist/http.js","test:watch":"vitest watch","test:coverage":"vitest run --coverage"},"version":"0.9.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"74dd0874-614d-4b0d-a1d6-bc6ab5b7554b"},"approver":{"name":"calebl","email":"caleb.lenoir@hey.com"}},"homepage":"https://github.com/calebl/ynab-mcp-server#readme","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"overrides":{"undici":"^7.30.1"},"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"_npmVersion":"11.21.2","description":"MCP server for interacting with a YNAB plan","directories":{},"maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"_nodeVersion":"22.23.4","contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"dependencies":{"zod":"^4.5.4","jose":"^6.2.14","ynab":"^4.5.0","@modelcontextprotocol/sdk":"^1.32.1","@modelcontextprotocol/server":"^2.3.0","@cloudflare/workers-oauth-provider":"^0.10.3"},"devDependencies":{"vitest":"^4.1.11","wrangler":"^4.129.0","typescript":"^5.3.3","@types/node":"^22.20.3","@vitest/coverage-v8":"^4.1.11","@cloudflare/workers-types":"^5.20260906.1","@modelcontextprotocol/inspector":"0.16.8"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ynab-mcp-server_0.9.0_1794454598102_0.5185028660461514"},"_hasShrinkwrap":false}},"time":{"created":"2025-04-08T14:16:04.789Z","modified":"2026-11-12T03:36:38.537Z","0.1.0":"2025-04-08T14:16:04.955Z","0.1.1":"2025-04-08T14:23:07.194Z","0.1.2":"2025-04-21T14:43:33.458Z","0.2.0":"2026-09-17T14:20:05.093Z","0.2.1":"2026-09-17T18:53:36.016Z","0.3.0":"2026-09-22T14:34:15.933Z","0.4.0":"2026-10-02T12:51:02.239Z","0.4.1":"2026-10-05T02:24:58.507Z","0.4.2":"2026-10-15T02:19:09.663Z","0.5.0":"2026-10-19T13:44:15.911Z","0.6.0":"2026-10-21T14:20:24.666Z","0.7.1":"2026-10-27T02:17:11.368Z","0.7.2":"2026-11-01T11:17:21.912Z","0.8.0":"2026-11-02T17:28:44.826Z","0.9.0":"2026-11-12T03:36:38.198Z"},"bugs":{"url":"https://github.com/calebl/ynab-mcp-server/issues"},"author":{"name":"Caleb LeNoir","email":"caleb.lenoir@hey.com"},"license":"MIT","homepage":"https://github.com/calebl/ynab-mcp-server#readme","keywords":["mcp","model-context-protocol","ynab","budgeting","personal-finance"],"repository":{"url":"git+https://github.com/calebl/ynab-mcp-server.git","type":"git"},"description":"MCP server for interacting with a YNAB plan","contributors":[{"url":"https://github.com/lwsinclair","name":"lwsinclair"},{"url":"https://github.com/grandcamel","name":"grandcamel"},{"url":"https://github.com/ianthebeard","name":"ianthebeard"}],"maintainers":[{"name":"calebl","email":"caleb.lenoir@hey.com"}],"readme":"# ynab-mcp-server\n\nA Model Context Protocol (MCP) server for interacting with your YNAB plans at https://ynab.com\n\nIn order to have an AI interact with this tool, you will need to get your Personal Access Token\nfrom YNAB: https://api.ynab.com/#personal-access-tokens. When adding this MCP server to any\nclient, you will need to provide your personal access token as YNAB_API_TOKEN. **This token\nis never directly sent to the LLM.** It is stored privately in an environment variable for\nuse with the YNAB api.\n\nA [Model Context Protocol](https://modelcontextprotocol.io) server that lets an AI\nassistant read and modify a [YNAB](https://ynab.com) plan.\n\nThe server talks to the YNAB API through the official\n[`ynab` SDK](https://github.com/ynab/ynab-sdk-js). Your Personal Access Token\nlives in an environment variable and is never sent to the model.\n\nIt runs two ways from one codebase:\n\n- **Local (stdio)** — a child process of Claude Code or Claude Desktop on your\n  own machine. Simplest, but only works on that machine while it is running.\n- **Remote (Cloudflare Worker)** — deployed behind GitHub sign-in and added to\n  claude.ai as a custom connector, so it works from the web and the mobile app\n  with your computer switched off. See [DEPLOY.md](./DEPLOY.md).\n\nBoth entry points register the shared tools from `src/registry.ts`. The Worker\ncan also run an optional scheduled auto-budget service that records what it\nwould categorize, approve and assign without changing your plan and delivers\nspending alerts; see\n[Auto-budget service](./DEPLOY.md#auto-budget-service-optional).\n\nOther providers:\n\n<a href=\"https://glama.ai/mcp/servers/@calebl/ynab-mcp-server\">\n  <img width=\"380\" height=\"200\" src=\"https://glama.ai/mcp/servers/@calebl/ynab-mcp-server/badge\" alt=\"YNAB Server MCP server\" />\n</a>\n\n[![LightNow](https://lightnow.ai/badge/io.github.calebl/ynab-mcp-server)](https://lightnow.ai/servers/io.github.calebl/ynab-mcp-server)\n\n\n## Setup\n\nGet a Personal Access Token from <https://api.ynab.com/#personal-access-tokens>, then:\n\n```bash\nnpm install\nnpm run build\n```\n\nEnvironment variables:\n\n| Variable | Required | Purpose |\n| --- | --- | --- |\n| `YNAB_API_TOKEN` | yes | Personal Access Token used for every API call |\n| `YNAB_PLAN_ID` | no | Default plan, so tools can omit `planId`. Find it with `ynab_list_plans`. |\n| `TYPESAFE_API_KEY` | no | Operator-owned TypeSafe credential. Required, but not sufficient, to enable category suggestions. |\n| `YNAB_AI_CATEGORIZATION` | no | Set to `\"true\"` together with `TYPESAFE_API_KEY` to expose the opt-in suggestion tool. |\n| `YNAB_AI_TYPICAL_PAYEES` | no | Set to `\"true\"` to send each category's most frequent payee names from the last 12 months with each model request. Off by default because it discloses aggregated payee history to TypeSafe. |\n| `YNAB_READ_ONLY` | no | Set to `\"true\"` (case-insensitive; surrounding whitespace is ignored) to remove tools that write to YNAB, in the stdio server, the HTTP server and the Worker. |\n| `YNAB_MCP_HOST`, `PORT` | no | HTTP server only. Address and port to listen on; default `127.0.0.1` and `3000`. |\n| `YNAB_MCP_ALLOWED_ORIGINS` | no | HTTP server only. Comma-separated browser origins allowed to call `/mcp` (e.g. `https://app.example.com`). Each entry is reduced to scheme, host and port, so a trailing slash is ignored. Empty by default, which refuses every request that carries an `Origin` header. |\n| `YNAB_MCP_ALLOWED_HOSTS` | no | HTTP server only. Comma-separated extra `Host` hostnames accepted while listening on a loopback address, for a reverse proxy on the same machine that forwards the client's `Host` (e.g. `mcp.example.com`). |\n| `ALLOWED_GITHUB_LOGIN` | no | Worker only. The single GitHub login allowed through [GitHub sign-in](./DEPLOY.md#github-sign-in). Required for GitHub sign-in. |\n| `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET` | no | Worker only. The GitHub OAuth app's credentials. Required for GitHub sign-in. |\n| `ALLOWED_REDIRECT_URIS` | no | Worker only. Exact OAuth callback URIs that GitHub sign-in may deliver grants to. See [Restricting redirects](./DEPLOY.md#restricting-redirects-optional). Must be unset with Cloudflare Access. |\n| `CF_ACCESS_TEAM_DOMAIN` | no | Worker only. Your Cloudflare Access team domain (`<team>.cloudflareaccess.com`). Setting any `CF_ACCESS_*` value replaces GitHub sign-in with [Cloudflare Access](./DEPLOY.md#cloudflare-access), which needs all three. |\n| `CF_ACCESS_AUD` | no | Worker only. The Access application's Audience (AUD) tag. |\n| `CF_ACCESS_ALLOWED_EMAIL` | no | Worker only. The single email allowed through Access. Any other identity, including a service token, is refused. |\n\n### Local: Claude Desktop / Claude Code\n\n```json\n{\n  \"mcpServers\": {\n    \"ynab\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/ynab-mcp-server/dist/index.js\"],\n      \"env\": {\n        \"YNAB_API_TOKEN\": \"your-token\",\n        \"YNAB_PLAN_ID\": \"your-plan-id\"\n      }\n    }\n  }\n}\n```\n\n### Self-hosted: streamable HTTP\n\nTo run the server in a container or behind your own reverse proxy or MCP\ngateway, start the HTTP entry point instead of the stdio one.\n\n> **It does no authentication of its own.** Anyone who can reach `/mcp` uses\n> your YNAB token with every tool you expose, including the write tools\n> unless `YNAB_READ_ONLY` is set. It listens on `127.0.0.1` unless you set\n> `YNAB_MCP_HOST`; only widen that on a private network or behind a proxy\n> that authenticates callers. For a hosted endpoint with sign-in built in,\n> use the Worker below.\n\nOn this machine only:\n\n```sh\nnpm run build\nYNAB_API_TOKEN=your-token npm run start:http\n```\n\nOutside a checkout, name the package as well as the command, so npm never\nlooks up a package called `ynab-mcp-server-http`:\n\n```sh\nYNAB_API_TOKEN=your-token npx --package ynab-mcp-server ynab-mcp-server-http\n```\n\nIn a container, where it must listen on every interface, start read-only\nunless whatever sits in front of it authenticates callers:\n\n```sh\nYNAB_API_TOKEN=your-token YNAB_READ_ONLY=true YNAB_MCP_HOST=0.0.0.0 PORT=3000 node dist/http.js\n```\n\nIt serves stateless [streamable HTTP](https://modelcontextprotocol.io/specification/2025-06-18/basic/transports#streamable-http)\nat `POST /mcp` and a health check at `GET /healthz`, with the same tools and\nenvironment variables as the stdio server. It holds one YNAB client for the\nlife of the process, so the plan-settings cache is shared across requests.\nBound to a non-loopback address with the write tools on, it prints a warning\nat startup.\n\nTo stop a web page reaching it through DNS rebinding, `/mcp` refuses with a\n403 any request that carries an `Origin` header not listed in\n`YNAB_MCP_ALLOWED_ORIGINS`. Browsers always send `Origin` on a POST;\ngateways and server-side MCP clients do not, so they are unaffected. While it\nlistens on a loopback address it also refuses any request whose `Host` is not\n`localhost`, `127.0.0.1` or `[::1]`.\n\nA reverse proxy on the same machine usually forwards the client's `Host`\n(Caddy and Traefik by default, nginx with `proxy_set_header Host $host`), which\nthat check refuses with `403 Host not allowed`. Either have the proxy send the\nupstream address as `Host` (Caddy: `header_up Host {upstream_hostport}`;\nnginx's default `$proxy_host` already does), or list the public hostname in\n`YNAB_MCP_ALLOWED_HOSTS`.\n\n### Remote: phone and claude.ai\n\nThe stdio server above cannot be reached from a phone. To use these tools from\nclaude.ai or the Claude mobile app, deploy `src/worker/` to Cloudflare Workers\nand add it as a custom connector. [DEPLOY.md](./DEPLOY.md) has the full walk\nthrough; the shape of it:\n\n1. Copy `wrangler.example.jsonc` to the git-ignored `wrangler.jsonc`, remove\n   the optional placeholder `AUTOBUDGET_DB` block unless you are configuring\n   the [auto-budget service](./DEPLOY.md#auto-budget-service-optional), run\n   `npx wrangler login`, then create the `OAUTH_KV` namespace\n2. `npm run deploy` once to learn your `*.workers.dev` hostname\n3. Create a GitHub OAuth app whose callback is `https://<host>/callback`\n4. Use `npx wrangler secret put` for `ALLOWED_GITHUB_LOGIN`, `YNAB_API_TOKEN`,\n   `GITHUB_CLIENT_ID`, `GITHUB_CLIENT_SECRET`, and `TYPESAFE_API_KEY`\n5. Run `npm run deploy` again\n6. Add `https://<host>/mcp` as a custom connector in claude.ai\n\nThe YNAB token stays a Worker secret and never reaches the client. GitHub sign-in\ncontrols **who may connect** to the remote Worker; the YNAB Personal Access\nToken controls **which YNAB account it reaches**. They answer different\nquestions, and neither substitutes for the other. The Worker uses one\nserver-wide YNAB token, so anyone admitted through the GitHub gate reaches the\ndeployer's YNAB account, money, and every plan available to that token—not\ntheir own YNAB account.\n`ynab_list_plans` lists all of those plans, and a caller-supplied `planId`\noverrides the optional `YNAB_PLAN_ID` default. Any GitHub account other than\n`ALLOWED_GITHUB_LOGIN` is refused. This matters because the tool set can create\nand delete transactions—an unauthenticated endpoint would grant access to those\nplans to anyone who found the URL.\n\nThe Worker is not tied to Claude. Any MCP client that supports remote servers\nwith OAuth can connect, for example Claude (claude.ai, desktop, and mobile),\nChatGPT connectors, Claude Code, or the MCP Inspector. Because clients register\nthemselves, every permitted sign-in shows an approval page naming the client\nand the exact address the grant will be sent to; approve only a sign-in you\njust started. To restrict which clients can connect at all, set\n`ALLOWED_REDIRECT_URIS` to their exact callback URIs (loopback redirects for\nlocal clients stay allowed). See\n[Approving MCP clients](./DEPLOY.md#approving-mcp-clients) for example callback\nURIs.\n\nTo sign in through Cloudflare Access instead of GitHub, see\n[Cloudflare Access](./DEPLOY.md#cloudflare-access),\nwhich also lists the MCP clients tested with it.\n\n## Why not YNAB OAuth?\n\nYNAB OAuth is deliberately not supported. Its token exchange requires a client\nsecret even with PKCE; an open-source package cannot ship a secret, so a local\npackage cannot honestly implement the authorization-code flow\n([OAuth application requirements](https://api.ynab.com/#oauth-applications)).\nThe only secretless flow YNAB documents is the implicit grant, which expires in\ntwo hours with no refresh\n([OAuth application requirements](https://api.ynab.com/#oauth-applications)).\nYNAB recommends a Personal Access Token for an individual accessing their own\naccount\n([Personal Access Tokens](https://api.ynab.com/#personal-access-tokens)).\n\nSetting `YNAB_READ_ONLY` to `\"true\"` drops every YNAB write tool from the tool\nlist, which is worth considering for a connector you will mostly use on a phone.\n\n## Tools\n\nPlan-scoped tools take an optional `planId` that falls back to\n`YNAB_PLAN_ID`. Optional tool inputs may be `null`; the server treats `null`\nthe same as omitting that input. All monetary values — in both directions — are\nplain currency amounts, never YNAB's milliunits. Reported amounts use the\nplan currency's precision (three decimals for currencies such as the Kuwaiti\ndinar) and fall back to two decimals if its settings cannot be read; conversion\nhappens in `src/tools/money.ts`.\n\n### Reading\n\n| Tool | What it does |\n| --- | --- |\n| `ynab_list_plans` | Every plan on the account. Run this first to find a plan ID. |\n| `ynab_plan_summary` | A month at a glance: income, budgeted, activity, Ready to Assign, plus categories split into `overspent`, `underfunded` (goal not yet met) and `positive_balance`. Hidden and deleted categories are excluded. `budgetVsActuals: true` adds a `budget_vs_actuals` block: `budgeted`, `activity`, `balance`, `variance` (budgeted plus activity) and `percent_used` (null when nothing was assigned) per category, subtotalled per category group and in `totals`. Credit Card Payments is listed as its own group but left out of `totals`, since its activity is card spending moving in minus payments going out. YNAB's internal Inflow: Ready to Assign category (whose activity is the month's income) is skipped; other internal categories, such as Uncategorized, are listed and counted when they have activity. |\n| `ynab_list_accounts` | Accounts with balances. `includeClosedAccounts` to see closed ones. |\n| `ynab_list_categories` | Categories grouped by category group, with goal info. |\n| `ynab_list_payees` | Payees, for resolving payee IDs. |\n| `ynab_list_months` | Every plan month since the plan began, with raw income, budgeted, activity, Ready to Assign, age-of-money and note fields. For recent income versus spending, use `ynab_cash_flow`. |\n| `ynab_list_scheduled_transactions` | The scheduled transactions set up in YNAB. For recurring charges found in transaction history, see `ynab_detect_recurring`; for a projected balance, `ynab_balance_forecast`. |\n| `ynab_get_transactions` | Transactions optionally filtered to `sinceDate`–`untilDate`, by `type` (`all`/`uncategorized`/`unapproved`), and by at most one of `accountId`, `categoryId` or `payeeId` (the first in that order wins). To search, add `payeeContains`, `memoContains` (case-insensitive), `minAmount`/`maxAmount` (ignoring sign) or `direction` (`outflow`/`inflow`/`any`); any search option or `untilDate` adds a `totals` block (`count`, `inflow`, `outflow`, `net`) over every match, including transfers between accounts, and `totalsOnly: true` returns only that. Without `categoryId` or `payeeId`, splits are matched leg by leg and the totals count only the matching legs; with them, rows are matched as YNAB returns them, so a split's parent row in the payee listing counts at its full amount. Rows come back newest first; `limit` defaults to 100, keeps the most recent rows, and does not affect the totals. |\n| `ynab_suggest_categories` | Opt-in, read-only category previews for unapproved, uncategorized ordinary outflows. Deleted and categorized rows are dropped in default mode; approved, reconciled, balance-adjustment, transfer, split, and inflow rows are skipped as applicable. |\n\n### Category suggestions (optional)\n\n`ynab_apply_category_suggestions` is a separate write tool that is available\nwithout enabling the TypeSafe preview. Provide up to 25 explicit\n`transaction_id`, `category_id`, and `expected_content_fingerprint` rows. The\ntool refetches each transaction and rejects stale or ineligible changes; a retry\nwhose category is already applied is a no-op. It supports validation-only dry\nruns and returns a pre-write undo manifest, but does not perform the undo. It\nnever auto-applies suggestions, calls TypeSafe, or approves transactions.\n\n`ynab_suggest_categories` is off by default. To expose it, set both an\noperator-owned `TYPESAFE_API_KEY` and `YNAB_AI_CATEGORIZATION=true`, then restart\nthe server. The API key is read from the environment (or a Worker secret), never\nfrom a tool argument. Omit `transactionIds`, pass `null`, or pass an empty\narray to fetch unapproved transactions and retain only uncategorized rows;\nprovide IDs to inspect only those transactions. In default mode, the tool\nchecks every retained row for deterministic eligibility and then applies\n`limit` to the first eligible outflows in YNAB's returned order. Skipped rows\ndo not consume the limit.\n\nThe tool is a dry-run preview: it never writes to YNAB, approves a transaction,\nor changes the behavior of `ynab_update_transaction`. It first handles exact\nfacts in code—dropping deleted rows and handling approved or reconciled rows,\nYNAB balance adjustments, transfers, splits, inflows, existing categories, and\nhidden/internal categories. In default mode, `transactions` contains only the\neligible rows inspected, `transaction_count` is that row count, and\n`eligible_transaction_count` reports all eligible rows available before the\nlimit. The top-level `skipped` object reports `total_count` and a `count` plus\n`transaction_ids` for each reason: `skipped_approved`, `skipped_reconciled`,\n`skipped_balance_adjustment`, `skipped_transfer`, `skipped_split`,\n`skipped_inflow`, and `skipped_already_categorized`. With explicit\n`transactionIds`, every non-deleted fetched row remains an individual result,\nincluding rows carrying a `skipped_*` status; deleted rows are omitted.\nPayee history uses the latest 12 months, capped at 50 qualifying rows. When the\npayee has no qualifying rows with the same payee ID, history falls back to rows\nfrom payees with a similar name: after Unicode NFC normalization, lowercasing,\nand removing everything except letters and numbers, one name begins the other\nand the shorter is at least six characters, so a truncated bank payee such as\n\"Better Bl\" draws on \"Better Blend\" history. Each history summary reports\n`match` (`payee`, `similar_payee_name`, or `null`) and\n`matched_payee_names`.\n\nEach eligible row is then routed in this order, and `source` names the step\nthat answered:\n\n1. **Exact-payee history (`history_rule`).** When at least one qualifying row\n   has the same payee ID and every such row uses the same still-eligible\n   category, that category is `suggested`. When those rows disagree, the row is\n   `needs_review` and proposes the most recently used category, with the\n   others as `top_alternatives` carrying their `history_count`. No model call is\n   made for either case.\n2. **Personal prior (`personal_prior`).** A naive-Bayes classifier is trained\n   for each request on the plan's own categorized ordinary outflows from the\n   same 12-month history, using payee and bank-import name tokens, the account,\n   and a coarse amount bucket. It is used when history contains categorized\n   rows across at least two categories; a single-category prior cannot rank\n   alternatives. Name tokens never seen in training are ignored rather than\n   scored. When its top category reaches probability 0.9, the row is\n   `suggested` without a model call. The probability is reported under\n   `personal_prior.ranking`, never as `model_confidence`. Below 0.9 the prior\n   only ranks: its top three appear on the model's row for comparison.\n3. **Model (`jev`).** Every remaining row goes to TypeSafe's pinned\n   `jev-1.13.0` System One model in batches of ten. A model answer is a ranked\n   shortlist, never a suggestion: every answer that names a category is\n   `needs_review`, while an explicit model abstention is `left_uncategorized`.\n   The pinned model's stored review threshold is therefore 0; thresholds stay\n   model-specific because confidence scales differ between models.\n\nSimilar-name history is never a rule; when a row reaches the model, it is\nincluded as suggestive evidence. The history summary's `reference_category_id` is the category a\nproposal is compared with: the most recently used one for exact-payee history,\nand the plurality for similar-name history. A similar-name disagreement is\nreported as `conflict` but does not change the status, because a prefix match\ndoes not establish merchant identity. Every inspected eligible row includes a\nstatus, source, content fingerprint, proposed category, model confidence and\nwinning probability (model rows only), up to three alternatives, the history\nsummary, and the personal-prior ranking where one was computed. The response's\n`thresholds` object reports the values in force, and `personal_prior` reports\nhow many rows trained the prior and whether it was available for routing.\nApplying a suggestion remains a separate, explicit human decision using\n`ynab_apply_category_suggestions` (or the general `ynab_update_transaction`\ntool).\n\nWhy this order: households file payees their own way, such as restaurants\nunder a groceries category or clinics under a savings category. A\ngeneral-purpose model cannot know that, but the plan's own history encodes it.\nOn real household history, history rules and the personal prior were much more\naccurate than a model on the same rows. The model's high-confidence answers\nwere wrong far more often than on synthetic fixtures, which is why they are\nreview-only. To evaluate your own plan, or a local model, see\n[Evaluating categorization and local decision models](./docs/local-decision-model.md).\n\nEnabling this feature sends the transaction's display payee, imported/original\npayee, memo, amount, date, and account name/type/on-budget status, plus visible\ncategory group and category names, to **TypeSafe as a third-party processor**.\nFor model-bound rows with similar-name matches, it also sends the matched payee\nnames and per-category key, group, name, and count. When\n`YNAB_AI_TYPICAL_PAYEES=true`, each model request also lists up to eight of each\ncategory's most frequent payee names from the last 12 months\n(`typical_payees`), and the response sets\n`typical_payees_sent: true`. This makes the model noticeably more accurate on a\nhousehold's own filing habits, but it discloses aggregated payee history, so it\nis off by default. It does not send YNAB UUIDs, balances, goals,\napproval/cleared state, or raw transaction history. Rows answered by history or\nthe personal prior are never sent. TypeSafe's published\nJev 1.13 price at the time of this release is **$0.042 per million input tokens;\noutput tokens are free**. The tool returns preflight estimates, actual token\nusage, and projected cost on each run\nand refuses requests over its per-call token/cost ceilings. Pricing and\nprovider limits can change; check <https://docs.typesafe.ai/models>.\n\nThe prototype is intentionally narrow and not default-on. Its original\n98.3% exact-label, 98.9% top-three, and 60/60 expected-abstention results came\nfrom 40 synthetic, single-evaluator fixtures, not a production accuracy claim.\nReal household history is much harder, as described above.\n\n### Reporting\n\nIn the spending reports, splits are counted through their subtransactions and\ntransfers between your own accounts are excluded, so they report spending rather\nthan money movement.\n\n| Tool | What it does |\n| --- | --- |\n| `ynab_spending_by_category` | Total spend per category over a date range, biggest first, with share of total. Defaults to the last 30 days. With `monthly: true`, each category also gets spend per calendar month, its mean over the full months, and its last full month's change against the earlier full months, over the last `months` months (default 6, at most 24) or from `sinceDate`, which overrides `months`; `untilDate` then defaults to today. Totals are gross outflows, so refunds aren't netted. |\n| `ynab_spending_by_payee` | The same, grouped by merchant, including `monthly`. |\n| `ynab_cash_flow` | Income vs spending per month with the running net, from YNAB's own monthly totals. Defaults to the last 6 months. |\n| `ynab_balance_forecast` | The combined balance of your accounts over the next `days` (default 30, max 365, from today in UTC), projected from scheduled transactions only: starting balance, the scheduled events, the end-of-day running balance, the lowest point and the ending balance. `accountIds` picks the accounts; the default is every open on-budget account. `limit` caps the events (default 100, `0` leaves them out); `event_count`, the running balance, low point and ending balance always cover every event. Transfers between two included accounts (credit card payments too) net to zero; a transfer to an account outside the forecast counts as money leaving, and one from such an account as money arriving. Splits are counted leg by leg. Occurrences whose date has passed but that YNAB hasn't entered yet count on the first day, marked `overdue` with their `scheduled_date` and summarised in `overdue_schedules`. A twice-a-month schedule's second date is approximated as 15 days after the first when YNAB doesn't give it, and marked `approximate`. |\n| `ynab_detect_recurring` | Recurring outflows such as subscriptions and bills: a payee's charges of a similar amount at a regular interval (weekly to yearly), with typical amount, yearly cost at the latest amount, next expected date, whether it seems to have stopped, and whether a scheduled transaction has the same payee name. Loan and mortgage payments are transfers, so they are not included, and refunds are not netted. A heuristic; defaults to the last 365 days. |\n\n### Writing\n\n| Tool | What it does |\n| --- | --- |\n| `ynab_create_transaction` | Creates a transaction. Needs `date`, `amount`, an account (`accountId` or `accountName`) and a payee (`payeeId` or `payeeName`); category optional as `categoryId` or `categoryName`, or `subtransactions` to split it. |\n| `ynab_update_transaction` | Updates any subset of an existing transaction's fields, or splits an unsplit one with `subtransactions`. |\n| `ynab_delete_transaction` | Deletes a transaction. Not undoable. |\n| `ynab_bulk_approve_transactions` | Approves an array of transaction IDs in one API call, or un-approves them with `approved: false`. |\n| `ynab_apply_category_suggestions` | Applies up to 25 explicit category suggestions with refetch and stale-data checks, dry-run support, and a pre-write undo manifest. Never auto-applies or approves transactions. |\n| `ynab_update_category_budget` | Sets the total budgeted amount for one category in a month. Not an increment; use `ynab_move_money` to move money between categories. |\n| `ynab_import_transactions` | Triggers an import from linked institutions, the same as hitting Import in the YNAB app. |\n| `ynab_move_money` | Moves budgeted money between two categories in a month, for covering overspending. |\n| `ynab_auto_assign` | Spreads Ready to Assign over categories with unmet monthly goals, largest shortfall first. `dryRun` to preview, `maxTotal` to cap it. |\n\n#### Names instead of IDs\n\n`ynab_create_transaction` accepts `accountName` and `categoryName` and matches\nthem loosely against the plan, so \"ally checking\" finds *Ally Checking*.\nClosed accounts and hidden categories are never matched. If a name is ambiguous\nor unrecognised the call fails and names the near misses rather than guessing,\nand successful calls echo back `matchedAccount` / `matchedCategory` so a wrong\nguess is visible.\n\n#### Split transactions\n\n`ynab_create_transaction` and `ynab_update_transaction` split a transaction\nacross categories when given `subtransactions`: two or more entries of\n`{ amount, category_name, payee_name, memo }`, the same shape\n`ynab_get_transactions` returns for a split. Amounts are in dollars and must add\nup to the transaction amount exactly (on update, the new `amount` if given,\notherwise the current one); categories go on the splits, not on the parent.\nSplit category names are matched like `categoryName` and echoed back as\n`matchedSplitCategories`.\n\nYNAB cannot change the splits of a transaction that is already split, so\n`ynab_update_transaction` refuses rather than silently dropping the change.\nDelete and recreate the transaction to re-split it.\n\n#### Writes that can half-succeed\n\nYNAB has no endpoint for moving money between categories, so `ynab_move_money`\nrewrites both categories' budgeted amounts in two calls. It takes from the\nsource first, so a failure in between leaves the money in Ready to Assign rather\nthan double-counted. When that happens the response sets `partial: true` and\ncarries a `recovery` line with the original amount to restore. `ynab_auto_assign`\nbehaves the same way: on failure it reports which categories were already funded\nand which were left alone.\n\nTools never throw at the protocol level. Failures come back as an MCP error\nresult (`isError: true`) with `{ \"success\": false, \"error\": \"...\" }` in the\ntext content, so a failed write is never mistaken for a successful one.\n\n#### Tool annotations\n\nEvery tool advertises MCP annotations (`readOnlyHint`, `destructiveHint`,\n`idempotentHint`, `openWorldHint`) alongside its schema. Tools that change\nneither YNAB nor the Worker's service state are `readOnlyHint: true`; among the\nYNAB writing tools, only `ynab_delete_transaction` sets `destructiveHint: true`.\nA client may use these hints to decide which calls need a confirmation prompt.\n\n#### `cleared` and `flagColor`\n\n`ynab_create_transaction` and `ynab_update_transaction` accept `cleared` as\none of `cleared`, `uncleared`, or `reconciled`, and `flagColor` as one of\n`red`, `orange`, `yellow`, `green`, `blue`, `purple`, or `\"\"` to clear an\nexisting flag.\n\n## Development\n\n```bash\nnpm run watch          # rebuild on change\nnpm test               # vitest (watch mode)\nnpm run test:run       # vitest, single run\nnpm run test:coverage  # coverage report\nnpm run typecheck      # typecheck both the node and Worker targets\nnpm run debug          # build, then open the MCP inspector\nnpm run dev:worker     # run the Worker locally with wrangler\nnpm run deploy         # deploy the Worker to Cloudflare\n```\n\n`dist/` is a build artifact and is not tracked in git; `npm run build` regenerates it.\n\n### Releasing\n\nBump the version in `package.json` and update `CHANGELOG.md`, then merge to `main` and create a GitHub release tagged in the existing `0.2.0` style (without a `v` prefix). The workflow stages that release with npm; it does not make the package public. The maintainer must run `npm stage list`, review it, and run `npm stage approve` with 2FA to promote it live. Configure a Trusted Publisher on npmjs.com for `ynab-mcp-server`, pointing at GitHub repository `calebl/ynab-mcp-server` and the exact workflow filename `.github/workflows/publish.yml` (the filename must match exactly); under Allowed actions select only `npm stage publish`.\n\n### Adding a tool\n\nEach tool is a self-contained module in `src/tools/` exporting `name`,\n`description`, `inputSchema` (a Zod shape) and `execute(input, api)`. See\n`CLAUDE.md` for the full template, then add the module to the `tools` array in\n`src/registry.ts` and write a test in `src/tests/`. Registering it there serves\nit from both the stdio server and the Worker; mark `writes: true` if the tool\nchanges data, which is what `YNAB_READ_ONLY` filters on.\n\nUseful references:\n- YNAB SDK types: `node_modules/ynab/dist/index.d.ts`\n- YNAB OpenAPI spec: <https://api.ynab.com/papi/open_api_spec.yaml>\n\n## Contributing\n\nPull requests are welcome. For a new tool or a larger change, please open an\nissue first so we can agree on the scope.\n\n1. Fork the repository and create a branch from `main`.\n2. Make your change and add or update tests in `src/tests/`. New tools follow\n   the pattern in [Adding a tool](#adding-a-tool).\n3. Run `npm run test:run` and `npm run typecheck`.\n4. Use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)\n   for commit messages and the pull request title.\n5. Open a pull request against `main`.\n\nEvery pull request runs the test suite on Node.js 22, 24 and 26 and receives an\nautomated code review. Both checks must pass and review conversations must be\nresolved before the pull request can be merged.\n\n## Compatibility\n\n`budgetId` and `YNAB_BUDGET_ID` are deprecated but still\naccepted; there is no removal date. Use `planId` and `YNAB_PLAN_ID` for new\nintegrations.\n\n## License\n\nSee [LICENSE](./LICENSE).\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/chart?repos=calebl/ynab-mcp-server&type=date&legend=top-left)](https://www.star-history.com/?repos=calebl%2Fynab-mcp-server&type=date&legend=top-left)\n","readmeFilename":"README.md"}