{"_id":"@codemill-solutions/yuki-mcp","_rev":"11-b27962164a8d379a0f908afd08f13c91","name":"@codemill-solutions/yuki-mcp","dist-tags":{"latest":"1.7.1"},"versions":{"1.0.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.0.0","_id":"@codemill-solutions/yuki-mcp@1.0.0","maintainers":[{"name":"codemillsolutions","email":"boye@codemill.dev"}],"dist":{"shasum":"b247a5fb8f8d3cf9676ef30a26649a037a6a1051","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.0.0.tgz","fileCount":35,"integrity":"sha512-LTkFnnI4LgNbLW4SUSkPXvlpUHT17db2JXVCcI64UPuoECm+WoIlNpVqdGKDRSqTxHtUikkvHh+hKyTgxPXZPQ==","signatures":[{"sig":"MEUCIEpJwYfnp1YCEZSm7Vqpqs4hI560HgxGEENMt1ng9OS3AiEAjxJA5aeeOCIK/5US97fCkdRjcVGXf66V1LliAOVIjIc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":158790},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"fb8316119a533d9bce314730318ba6bf62ec5a2a","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"boye@codemill.dev"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.0","dependencies":{"zod":"^3.24.1","axios":"^1.7.9","dotenv":"^16.4.7","fast-xml-parser":"^5.5.3","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.10.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","prettier":"^3.8.1","typescript":"^5.7.3","@types/node":"^22.10.10"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.0.0_1773434732734_0.7173411099407168","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@codemill-solutions/yuki-mcp","version":"1.0.1","_id":"@codemill-solutions/yuki-mcp@1.0.1","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"039bd3d410aa5d67bd1f74b53b15960df5bd4434","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.0.1.tgz","fileCount":35,"integrity":"sha512-u8Qq2mjXisw35KJ2I0syI4srD4OR04UDi1jJJGc9+0r3aHTVEFPS/qOlY0Yrkawj1+wTMAq2GjSFVDat36Xapg==","signatures":[{"sig":"MEYCIQDCqnxaXiddSnP49409jwZuEAZSy4dErLI3tbO3WksxhQIhAKLBz0ZOQYFZQrpDHjEXjrjQjxILeMFmK8gVrdnsLWh1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":160274},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"a6890627518cba53c02d950238bc602577524ccd","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.24.1","axios":"^1.7.9","dotenv":"^16.4.7","fast-xml-parser":"^5.5.3","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.10.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","prettier":"^3.8.1","typescript":"^5.7.3","@types/node":"^22.10.10"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.0.1_1773741189341_0.7740792408804436","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.1.0","_id":"@codemill-solutions/yuki-mcp@1.1.0","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"32c0c5ac4962defe452fd8b12c2c3a435cc0cd00","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.1.0.tgz","fileCount":39,"integrity":"sha512-kR8JR/X5sKjsJF6jjuKA65By5DLCB9Qa5x00kJw4B5AZr4ra28oR3cnjaqYUmHsP/bvByY1uvFqBj7Scths3Kw==","signatures":[{"sig":"MEYCIQCK/XTt3e8GoaVQUXEtsE6YqNzrruMQB0Hju0Hd0GF98AIhALGT4xr94x8svlwzb8JqrnDIA6HVQiDkQ3z6MlsAPWG7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":169370},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"4e83ae155b91a795e1f48f5cff8bc5392ff7f3c4","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.24.1","axios":"^1.7.9","dotenv":"^16.4.7","fast-xml-parser":"^5.5.8","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.10.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","prettier":"^3.8.1","typescript":"^5.7.3","@types/node":"^22.10.10"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.1.0_1774272681555_0.3833630360739355","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.2.0","_id":"@codemill-solutions/yuki-mcp@1.2.0","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"ee1eeea1fb96b1bfe291f8888661e85e50fc64f1","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.2.0.tgz","fileCount":43,"integrity":"sha512-tvsAGI/HrS3laBXjazEnXYOnjik1aAuNVAagmqIf+M4VXwUM0dNuvwMyNuIPsUtePcvpTjcKPDgwiNwWnEIh6A==","signatures":[{"sig":"MEUCIQCzAztYBcZp9v6UbgB6XRZDTtLYtzLaSd4Zow85Am3iRAIgFGbCW2nGlsJ3p4GOzKyUqMfEguXDabouyCr10A4vPjQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":238561},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"a183a99e01529a187bab5d15e5e11176c412ed99","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.24.1","axios":"^1.7.9","dotenv":"^16.4.7","fast-xml-parser":"^5.5.8","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.10.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","prettier":"^3.8.1","typescript":"^5.7.3","@types/node":"^22.10.10"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.2.0_1774619269353_0.08084753540690515","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.3.0","_id":"@codemill-solutions/yuki-mcp@1.3.0","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"0631d2445eb2da79c007cf6f024447d80a5ff1b5","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.3.0.tgz","fileCount":43,"integrity":"sha512-+iQlgSWYF7nYbq1WIZUUADbEfq9Ni8BWtCOEhklk+wBCcelZUzWICbKN0rE1migJr4ijzKpN5bqIXuFAivHW/A==","signatures":[{"sig":"MEUCIQDb5w4ZGJu68AYIFseF08IBJqN9ynoaIgbJNH9bFQYSEwIgJvQl0QipYj/QRBIzui4dcWPetfStSVHJXMAs6S1qj4Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":246913},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"34edf6a6c0b5a8a531fdda88fc7a55e80b98e6e8","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.1","dependencies":{"zod":"^3.24.1","axios":"^1.7.9","dotenv":"^16.4.7","fast-xml-parser":"^5.5.8","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.10.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","prettier":"^3.8.1","typescript":"^5.7.3","@types/node":"^22.10.10"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.3.0_1774982566015_0.6094468064502201","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.4.0","_id":"@codemill-solutions/yuki-mcp@1.4.0","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"f3e61c87b13702c1bcfecbcd87c6d99eb655660e","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.4.0.tgz","fileCount":43,"integrity":"sha512-OnFcL+9txbpPT71z4JNDpnM5J80XQrkO8FCHkR4+gwxUGlErUsIJKAATZeh0y5dFYBMPBu4YdcW1hIaQ5xwQ6A==","signatures":[{"sig":"MEUCIQDPRHXgAtOo8xDXF9rkU87Rt4Ia7Onv18xc8rGPduxedwIgJUkflioLMQij4+ecVDhqdwnEY3uALE+EWe1oysI5WSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":254048},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"b70ab1d57de1e2a8082e1c31697b24535b0e6de6","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.24.1","axios":"^1.7.9","dotenv":"^16.4.7","fast-xml-parser":"^5.5.8","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.10.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","prettier":"^3.8.1","typescript":"^5.7.3","@types/node":"^22.10.10"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.4.0_1778505324930_0.28055387644625407","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.5.0","_id":"@codemill-solutions/yuki-mcp@1.5.0","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"3e041c8304975655bbff1740a4ab0a8324c48f05","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.5.0.tgz","fileCount":43,"integrity":"sha512-2HdFR7cgbozymFmbssVloF4o/KbCHb6c+4WPOA3sAEkIU1uaQBY6aRBsit+3cYn2o07ZyA+aSp6cL3GFi4ynAA==","signatures":[{"sig":"MEYCIQDC5eO6Z59LNFGkREhDliG+P1csA1ML/v2UG8M99xiNRgIhAPN7j5btYBPT5gBwgB8ZBJNUNij+fYJ7VtdKZ8I2yQPw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":267390},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"9bb7f45bc96666afff60bec4e0d5d97faa5d96b5","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.24.1","axios":"^1.7.9","dotenv":"^16.4.7","fast-xml-parser":"^5.5.8","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.10.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.19.2","prettier":"^3.8.1","typescript":"^5.7.3","@types/node":"^22.10.10"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.5.0_1779112113456_0.22692321944651983","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@codemill-solutions/yuki-mcp","version":"1.5.1","keywords":["mcp","model-context-protocol","yuki","yukiworks","accounting","boekhouden","soap","ai","agent","anthropic","claude"],"author":{"name":"CodeMill Solutions B.V."},"license":"MIT","_id":"@codemill-solutions/yuki-mcp@1.5.1","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"34c1cbcb6f2e0cd931086856c1d87440bfe331b5","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.5.1.tgz","fileCount":43,"integrity":"sha512-e9UsOZXgzEd4GapmySkDNDX8iBJjxddaqFp58NKBoYpHwQSLtWXkk71bNSAHFvNFsGvq1aFF4cBgGkHWlIZieA==","signatures":[{"sig":"MEQCIEISLWKmQhGGESwT4pceU/AdTFujSbPO5wyRrcQqapsVAiBsF5F5YVeqyyqwHIkbs0OmEhsLaiHbSPLVmYNRAnsXdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":267682},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"gitHead":"c120d93d867d58484cd1cf25eac7db7d10cf92b5","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.25.76","axios":"^1.16.1","dotenv":"^16.6.1","fast-xml-parser":"^5.8.0","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","prettier":"^3.8.3","typescript":"^5.9.3","@types/node":"^22.19.19"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.5.1_1779883708346_0.2756361601659607","host":"s3://npm-registry-packages-npm-production"}},"1.6.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.6.0","keywords":["mcp","model-context-protocol","yuki","yukiworks","accounting","boekhouden","soap","ai","agent","anthropic","claude"],"author":{"name":"CodeMill Solutions B.V."},"license":"MIT","_id":"@codemill-solutions/yuki-mcp@1.6.0","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"7295b6a8f7b9cee972bfefcc2e49aae0f36a5ad2","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.6.0.tgz","fileCount":43,"integrity":"sha512-PJLF4MzLtJ31OWNQJYPiGVc0efkbwprFMGYQtkSzAzU1AC5mC3+FdgNwZxfl+vN+9kVGxPsa2aHr65yzFgmZgw==","signatures":[{"sig":"MEYCIQDgvxZeh648w/fqUf864kv78dO58IUPXgNWVRB9MnKdDgIhAJWGh8IIH4hVUceUDaQYUU+M7OMtJvvxroeESOXOmfnO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":272435},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"gitHead":"d96476c89db4db7b968fa180b80653216802337c","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.25.76","axios":"^1.16.1","dotenv":"^16.6.1","fast-xml-parser":"^5.8.0","@anthropic-ai/sdk":"^0.78.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","prettier":"^3.8.3","typescript":"^5.9.3","@types/node":"^22.19.19"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.6.0_1787749332426_0.3371796842377195","host":"s3://npm-registry-packages-npm-production"}},"1.7.0":{"name":"@codemill-solutions/yuki-mcp","version":"1.7.0","keywords":["mcp","model-context-protocol","yuki","yukiworks","accounting","boekhouden","soap","ai","agent","anthropic","claude"],"author":{"name":"CodeMill Solutions B.V."},"license":"MIT","_id":"@codemill-solutions/yuki-mcp@1.7.0","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"bin":{"yuki-mcp":"dist/index.js"},"dist":{"shasum":"79c3d490225c7c3b4349cee2a3b4f16d49a4dccd","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.7.0.tgz","fileCount":43,"integrity":"sha512-+ksNq4AAYrnv1yUajvP7+YbU8tQAPQs20ZMjqSBBa01j97810EuitA9ibpHZqXGTaTavxSSZrUOi3yeDzyJXew==","signatures":[{"sig":"MEUCIFUXmlJxWLwUo2iKTCAhrlXuhDipaCQDa9jfc7y9meKdAiEAyqp7XAO7cuN1yrcwBsz+/7cur7ElmmBQXoKtHxGPR3E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":289716},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"gitHead":"bf2decca9ede4ae7b89686cc046e7bb931b007c5","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"codemillsolutions","email":"dev@codemill.dev"},"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"10.8.2","description":"MCP server for the Yuki accounting SOAP API","directories":{},"_nodeVersion":"20.20.2","dependencies":{"zod":"^3.25.76","axios":"^1.16.1","dotenv":"^16.6.1","fast-xml-parser":"^5.8.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","prettier":"^3.8.3","typescript":"^5.9.3","@types/node":"^22.19.19","@anthropic-ai/sdk":"^0.78.0"},"_npmOperationalInternal":{"tmp":"tmp/yuki-mcp_1.7.0_1788419371936_0.7364804873844819","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"_id":"@codemill-solutions/yuki-mcp@1.7.1","bin":{"yuki-mcp":"dist/index.js"},"bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"dist":{"shasum":"b450e540ca67813277137a23cca9cdbd90992629","tarball":"https://registry.npmjs.org/@codemill-solutions/yuki-mcp/-/yuki-mcp-1.7.1.tgz","fileCount":43,"integrity":"sha512-RmZc6yCpYumeKDb6kaR0ghA7UrDgm54vmAlhr3VFe/DZxSP7R2oGbodiGxDQuRhGSiNGaSN8/9j+ozD9mTxYKA==","signatures":[{"sig":"MEYCIQDyL0UAI6NJuUeryif96YnCtAba6KH6BFdxVv+0DfSFJAIhAPW7dOomTrMkLKvWKqin0TyrCsLby5u0MJ1Au2jXJ6By","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDRm7KcXtpGyWbDk+s52xIJ4ubF/FcZTaIF6nFPM4ccsgIgFC2atEYxlSbZv1cqz98PtFCYbZVT/EoU33Mh32Y8c2o="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codemill-solutions%2fyuki-mcp@1.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":292171},"main":"dist/index.js","name":"@codemill-solutions/yuki-mcp","type":"module","types":"dist/index.d.ts","author":{"name":"CodeMill Solutions B.V."},"engines":{"node":">=20"},"gitHead":"ec52d6d25c34106f204f23dc88bd79c3a0057898","license":"MIT","scripts":{"dev":"tsx src/index.ts","agent":"npx tsx scripts/test-agent.ts","build":"tsc","start":"node dist/index.js","inspect":"npx @modelcontextprotocol/inspector node dist/index.js","prepublishOnly":"npm run build"},"version":"1.7.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c562504a-6351-4b0a-8be7-db72bcb7946e"}},"homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","keywords":["mcp","model-context-protocol","yuki","yukiworks","accounting","boekhouden","soap","ai","agent","anthropic","claude"],"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for the Yuki accounting SOAP API","directories":{},"maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"_nodeVersion":"24.20.0","dependencies":{"zod":"^3.25.76","axios":"^1.16.1","dotenv":"^16.6.1","fast-xml-parser":"^5.8.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.3","prettier":"^3.8.3","typescript":"^5.9.3","@types/node":"^22.19.19","@anthropic-ai/sdk":"^0.78.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/yuki-mcp_1.7.1_1789470811150_0.23700606400849744"}}},"time":{"created":"2026-03-13T20:45:32.648Z","modified":"2026-09-15T11:13:31.542Z","1.0.0":"2026-03-13T20:45:32.896Z","1.0.1":"2026-03-17T09:53:09.489Z","1.1.0":"2026-03-23T13:31:21.706Z","1.2.0":"2026-03-27T13:47:49.490Z","1.3.0":"2026-03-31T18:42:46.167Z","1.4.0":"2026-05-11T13:15:25.079Z","1.5.0":"2026-05-18T13:48:33.609Z","1.5.1":"2026-05-27T12:08:28.469Z","1.6.0":"2026-08-26T13:02:12.657Z","1.7.0":"2026-09-03T07:09:32.068Z","1.7.1":"2026-09-15T11:13:31.243Z"},"bugs":{"url":"https://github.com/CodeMill-Solutions/yuki-mcp/issues"},"author":{"name":"CodeMill Solutions B.V."},"license":"MIT","homepage":"https://github.com/CodeMill-Solutions/yuki-mcp#readme","keywords":["mcp","model-context-protocol","yuki","yukiworks","accounting","boekhouden","soap","ai","agent","anthropic","claude"],"repository":{"url":"git+https://github.com/CodeMill-Solutions/yuki-mcp.git","type":"git"},"description":"MCP server for the Yuki accounting SOAP API","maintainers":[{"name":"codemillsolutions","email":"dev@codemill.dev"}],"readme":"# yuki-mcp\n\nA [Model Context Protocol](https://modelcontextprotocol.io) (MCP) server that connects AI agents to [Yuki](https://www.yukiworks.nl) accounting via Yuki's SOAP API.\n\nBuilt with Node.js, TypeScript, and [`@modelcontextprotocol/sdk`](https://github.com/modelcontextprotocol/typescript-sdk).\n\n---\n\n## Installation\n\nThe quickest way is to let your MCP host run the package directly through `npx` — nothing to install or build. Add it to your MCP host configuration (e.g. `claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"yuki\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@codemill-solutions/yuki-mcp\"],\n      \"env\": {\n        \"YUKI_API_KEY\": \"your-api-key-here\",\n        \"YUKI_DOMAIN_ID\": \"your-administration-guid-here\",\n        \"YUKI_REGION\": \"nl\"\n      }\n    }\n  }\n}\n```\n\n> **Belgian administrations must set `YUKI_REGION=be`.** See [API region](#api-region).\n\nPrefer a pinned local install? Install the package and point your host at its entry point instead:\n\n```bash\nnpm install @codemill-solutions/yuki-mcp\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"yuki\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/node_modules/@codemill-solutions/yuki-mcp/dist/index.js\"],\n      \"env\": {\n        \"YUKI_API_KEY\": \"your-api-key-here\",\n        \"YUKI_DOMAIN_ID\": \"your-administration-guid-here\",\n        \"YUKI_REGION\": \"nl\"\n      }\n    }\n  }\n}\n```\n\n> Desktop MCP hosts such as Claude Desktop do not inherit your shell's `PATH`. If the server only reports **\"Server disconnected\"**, use absolute paths for the command (`which npx` / `which node`, e.g. `/opt/homebrew/bin/npx` on Apple Silicon Macs) — see [Troubleshooting](#troubleshooting).\n\n---\n\n## Prerequisites\n\n- Node.js 20+\n- A Yuki account with API access enabled\n- Your Yuki API key (Yuki → Settings → API)\n\n---\n\n## Setup\n\n### 1. Install dependencies\n\n```bash\nnpm install\n```\n\n### 2. Configure environment variables\n\n```bash\ncp .env.example .env\n```\n\nEdit `.env`:\n\n```env\nYUKI_API_KEY=your-api-key-here\nYUKI_DOMAIN_ID=your-administration-guid-here  # optional at startup\nYUKI_REGION=nl                                # nl (default) or be\n```\n\n`YUKI_DOMAIN_ID` can be left empty — the server starts without it. Call `get_administrations` to discover the correct GUID, then pass it via the `administrationId` parameter on individual tools.\n\n### 3. Build\n\n```bash\nnpm run build\n```\n\n### 4. Connect to an MCP host\n\nAdd to your MCP host configuration (e.g. `claude_desktop_config.json`):\n\n```json\n{\n  \"mcpServers\": {\n    \"yuki\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/yuki-mcp/dist/index.js\"],\n      \"env\": {\n        \"YUKI_API_KEY\": \"your-api-key-here\",\n        \"YUKI_DOMAIN_ID\": \"your-administration-guid-here\"\n      }\n    }\n  }\n}\n```\n\n---\n\n## API region\n\nYuki runs a separate API host per region, and an administration only exists on the host\nfor its own region. A key for a Belgian administration authenticates successfully against\nthe Dutch host but then fails on **every** data call with:\n\n```\nSOAP Fault: Domain has no active database\n```\n\nSet the region to match your administration:\n\n| Variable | Values | Default | Purpose |\n| --- | --- | --- | --- |\n| `YUKI_REGION` | `nl`, `be` | `nl` | Selects a known regional API host |\n| `YUKI_BASE_URL` | full URL | — | Overrides `YUKI_REGION` entirely; use for hosts not listed above |\n\n```env\nYUKI_REGION=be\n```\n\n`YUKI_BASE_URL` takes precedence when both are set, so a new or private host can be reached\nwithout waiting on a release:\n\n```env\nYUKI_BASE_URL=https://api.yukiworks.be/ws/\n```\n\nDefaults are unchanged — omitting both keeps the previous `api.yukiworks.nl` behaviour.\n\n### Per administration\n\n`YUKI_REGION` / `YUKI_BASE_URL` set the server-wide default. When one server serves administrations in more than one region, pin the exceptions in the [keys file](#keys-file-format):\n\n```json\n{\n  \"<dutch-administration-id>\": \"api-key-nl\",\n  \"<belgian-administration-id>\": { \"apiKey\": \"api-key-be\", \"region\": \"be\" }\n}\n```\n\nWhen a call still lands on the wrong host, the `Domain has no active database` fault names the host that was called and the regions to try.\n\n---\n\n## Multi-administration support\n\nIf you manage **multiple Yuki administrations** (each with its own API key), you can supply a JSON file that maps every `administrationId` to its corresponding API key. The server then authenticates per administration automatically — no single shared key required. Administrations in different regions can share one server: give an entry its own `region`.\n\n### Keys file format\n\nEach value is either the API key itself, or an object with the key plus an optional region override:\n\n```json\n{\n  \"a1b2c3d4-0000-0000-0000-000000000001\": \"api-key-for-admin-1\",\n  \"a1b2c3d4-0000-0000-0000-000000000002\": { \"apiKey\": \"api-key-for-admin-2\", \"region\": \"be\" },\n  \"a1b2c3d4-0000-0000-0000-000000000003\": { \"apiKey\": \"api-key-for-admin-3\", \"baseUrl\": \"https://api.yukiworks.be/ws/\" }\n}\n```\n\n| Field | Required | Purpose |\n|-------|----------|---------|\n| `apiKey` | yes | The administration's API key |\n| `region` | no | `nl` or `be` — the API host for this administration. Defaults to the server-wide `YUKI_REGION` |\n| `baseUrl` | no | Full API URL for this administration; takes precedence over `region` |\n\nPlain string entries keep using the server-wide region, so existing files work unchanged. An unknown `region` is reported as an error (at startup or from `reload_keys`) rather than silently falling back to the default host. Each session is bound to the host that issued it, so tools need no extra parameters; `reload_keys` treats a changed region like a changed key and re-authenticates.\n\n### Path resolution (first match wins)\n\n| Priority | Path |\n|----------|------|\n| 1 | `YUKI_API_KEYS_FILE` environment variable (explicit path) |\n| 2 | `~/.yuki/api-keys.json` (default user-level location) |\n| 3 | `./api-keys.json` (local fallback for development) |\n\n### Environment variable\n\n```env\nYUKI_API_KEYS_FILE=/path/to/your/api-keys.json\n```\n\nWhen a keys file is present, `YUKI_API_KEY` becomes optional — the file keys are used for all administration-specific tool calls, and `YUKI_API_KEY` (if set) serves as the fallback for tools that don't target a specific administration (e.g. `get_administrations`).\n\nIf neither `YUKI_API_KEY` nor a keys file is found at startup, the server logs a warning but continues running — tools will return an error when called.\n\n### Reloading keys at runtime\n\nWhen a new key is generated externally — for example by a sibling MCP server that drives the Yuki Integraties UI to create a fresh API key for a new administration — the new entry only lands in `~/.yuki/api-keys.json`. By default the MCP server reads that file once at startup, so a freshly added key would require a server restart before it can be used for SOAP calls.\n\nThe **`reload_keys`** tool (see [Available tools](#available-tools-31) below) avoids this: it re-reads the keys file from disk and replaces the in-memory map in place. Sessions for entries whose key or region **changed** or that were **removed** are evicted from the session cache automatically; sessions for unchanged entries stay warm so subsequent calls do not pay the re-authentication cost.\n\nTypical flow for a sibling tool that has just minted a new key:\n\n```\n1. (external) write the new key to ~/.yuki/api-keys.json\n2. yuki-mcp.reload_keys()        → { added: [<adminId>], updated: [], removed: [], total: N }\n3. yuki-mcp.get_administrations  → now works for the new admin without restart\n```\n\n`reload_keys` takes no arguments: it always reads the file resolved by the rules above. Which file holds the keys is the operator's decision — the environment variable or a default location — and an MCP client can trigger a reload but cannot choose the file. Versions up to 1.7.0 accepted an optional `path` argument; it is ignored since 1.7.1 (see the [changelog](CHANGELOG.md)). A file that does not parse is reported as `API keys file at … is not valid JSON`, without quoting its contents.\n\n---\n\n## Available tools (31)\n\n### Administrations\n\n| Tool | Description |\n|------|-------------|\n| `get_administrations` | List all administrations (companies) for this API key. **Run this first** to find the correct `administrationId`. |\n| `get_administration_id` | Look up an administration's GUID by its exact name. Useful when you know the name but not the GUID. |\n| `reload_keys` | Re-read the `administrationId → apiKey` JSON file (including per-administration `region` overrides) from its configured location without restarting the server. Takes no arguments. Returns a diff of added/updated/removed IDs and invalidates affected sessions. Use after an external `create_api_key` flow. |\n\n### Relations\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `search_relations` | `searchValue`, `searchOption?`, `active?`, `pageNumber?` | Search customers and suppliers by name, code, VAT number, email, etc. Returns up to 100 results per page. |\n| `upsert_contact` | `fullName`, `contactCode?`, `contactType?`, … | Create or update a contact. When `contactCode` matches an existing record it is updated; otherwise a new contact is created. |\n\n### Sales invoices\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `get_sales_invoices` | `dateOutstanding?`, `sortOrder?`, `includeBankTransactions?` | Retrieve outstanding (unpaid) sales invoices. |\n| `process_sales_invoice` | `reference`, `subject`, `date`, `dueDate`, `contact`, `lines` | Create and book a new sales invoice. Optionally email it to the customer. |\n\n### Purchase invoices\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `get_missing_invoices` | `types?` | Retrieve bank payments that still need a matching purchase invoice — equivalent to \"Postbus → Ontbrekende facturen\" in the Yuki web interface. Works for Dutch and Belgian administrations; the response includes `typesSeen`, and an unexpected `<Type>` label can be passed via `types`. |\n| `get_purchase_invoices` | `dateOutstanding?`, `sortOrder?`, `includeBankTransactions?` | Retrieve outstanding (unpaid) purchase invoices. |\n| `process_purchase_invoice` | `date`, `invoiceAmount`, `invoiceVatAmount`, `contact`, `lines` | Book an incoming purchase invoice. Accepts an optional PDF as base64. |\n\n### Transactions & bank\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `get_transactions` | `glAccountCode`, `startDate`, `endDate` | Retrieve journal entries for a GL account (e.g. a bank account) in a date range. Use `get_gl_accounts` to find the right code. |\n| `get_transaction_details` | `reference` | Check if an outstanding item still exists and retrieve its current status. |\n| `process_journal` | `subject`, `entries[]` | Post a general journal entry (memoriaal). All entry amounts must sum to exactly 0. Used for bank reconciliation, corrections, and custom bookings. |\n\n### Accounting\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `get_gl_accounts` | `date?` | Retrieve all GL accounts with their balance at a given date (commercial view). Use this to find account codes before calling `get_transactions`. |\n| `get_gl_accounts_fiscal` | `date?` | Same as `get_gl_accounts` but including fiscal corrections. Use for balance sheets and P&L views that must match Yuki's fiscal reports. |\n| `get_net_revenue` | `startDate`, `endDate`, `fiscal?` | Retrieve net revenue (netto-omzet) for a date range. Set `fiscal=true` to include fiscal corrections. |\n\n### Accounting info\n\nRicher read-only views from the `AccountingInfo.asmx` service — not available through the standard `Accounting.asmx`.\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `get_gl_account_scheme` | — | Retrieve the complete GL account scheme (rekeningschema): all codes with type, subtype, description, and active/inactive status. Use to validate GL codes or build account pickers. |\n| `get_period_table` | `yearId` | Retrieve the fiscal period table for a year: period numbers, names, and date ranges. Use to translate transaction dates into human-readable period names for reports. |\n| `get_gl_transactions_detailed` | `startDate`, `endDate`, `glAccountCode?`, `financialMode?` | Detailed transaction listing with document type, archive folder, fiscal period ID, project code, and mutation user. More complete than `get_transactions`. Leave `glAccountCode` empty for all accounts. |\n| `get_transaction_document` | `transactionId` | Download the source PDF for a booked transaction as base64. Use the `id` or `hID` from `get_gl_transactions_detailed`. |\n| `get_start_balances` | `yearId`, `financialMode?` | Retrieve opening balances (beginbalansen) per GL account for a fiscal year. |\n\n### Documents\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `upload_document` | `fileName`, `dataBase64`, `folder?`, `amount?` | Upload a PDF to the Yuki archive by passing its content as a base64 string. Use `get_document_folders` first to find the right folder ID. |\n| `upload_document_from_path` | `filePath`, `fileName?`, `folder?`, `amount?` | Upload a PDF from a local file path. Reads and encodes the file internally — preferred over `upload_document` when the file is available on disk. Validates that the file exists and is a valid PDF before uploading. |\n| `get_document_folders` | — | List all archive folders available in the administration. |\n| `list_documents` | `folderId` | List documents in a specific archive folder. Returns document IDs, file names, dates, and amounts. |\n| `search_documents` | `searchText` | Full-text search across all archived documents (file names, amounts, OCR content). |\n| `get_document` | `documentId` | Retrieve metadata for a single archived document by its ID (name, folder, date, amount, status). |\n| `download_document` | `documentId` | Download an archived document as a base64-encoded string. |\n| `get_cost_categories` | — | List available GL cost categories for use as the `costCategory` parameter in upload tools. |\n\n### Backoffice\n\n| Tool | Key parameters | Description |\n|------|----------------|-------------|\n| `get_workflow` | `administrationId?` | Retrieve backoffice workflow items — documents that could not be processed automatically and are awaiting review by the accountant. |\n| `get_outstanding_questions` | `administrationId?` | Retrieve outstanding questions raised by the accountant that require a response before the related documents can be processed. |\n\n---\n\n## Testing\n\n### Option 1 — MCP Inspector (tool-level, no LLM)\n\n```bash\nnpm run inspect\n```\n\nOpens a browser UI at `http://localhost:5173` where you can call individual tools and inspect raw responses.\n\n### Option 2 — Agent test harness (with Claude)\n\nRuns a full agentic loop: Claude reasons about the task, calls tools, and returns a final answer — exactly as an AI agent would use this MCP.\n\nAdd your Anthropic API key to `.env`:\n\n```env\nANTHROPIC_API_KEY=sk-ant-...\n```\n\nThen run a scenario:\n\n```bash\nnpm run agent                                              # default: get_administrations\nnpm run agent -- --scenario outstanding-invoices\nnpm run agent -- --scenario search-relations --arg \"Bedrijf BV\"\nnpm run agent -- --scenario gl-accounts\nnpm run agent -- --scenario bank-transactions --arg \"1200\"\nnpm run agent -- --scenario full-workflow\n```\n\nAvailable scenarios: `get-administrations`, `search-relations`, `outstanding-invoices`, `outstanding-payables`, `gl-accounts`, `bank-transactions`, `full-workflow`.\n\n---\n\n## Architecture\n\n```\nsrc/\n├── index.ts                  # Entry point — loads env + keys file, registers tools, starts stdio transport\n├── yuki-client.ts            # SOAP client: per-key session cache, envelope builder, axios HTTP, fast-xml-parser\n└── tools/\n    ├── administrations.ts    # get_administrations, get_administration_id\n    ├── relations.ts          # search_relations, upsert_contact\n    ├── invoices.ts           # get_sales_invoices, get_purchase_invoices,\n    │                         # process_sales_invoice, process_purchase_invoice\n    ├── transactions.ts       # get_transactions, get_transaction_details, process_journal\n    ├── accounting.ts         # get_gl_accounts, get_gl_accounts_fiscal, get_net_revenue\n    ├── accounting-info.ts    # get_gl_account_scheme, get_period_table,\n    │                         # get_gl_transactions_detailed, get_transaction_document,\n    │                         # get_start_balances, get_missing_invoices\n    ├── documents.ts          # upload_document, upload_document_from_path,\n    │                         # get_document_folders, list_documents, search_documents,\n    │                         # get_document, download_document, get_cost_categories\n    └── backoffice.ts         # get_workflow, get_outstanding_questions\n\nscripts/\n└── test-agent.ts             # Agent test harness (Claude + MCP client loop)\n```\n\n### Auth flow\n\nYuki uses a two-step authentication pattern:\n\n1. `Authenticate(accessKey)` → returns a temporary `sessionID`\n2. All subsequent calls include that `sessionID`\n\n`YukiClient.getSessionID(adminId?)` handles this transparently. When called with an `administrationId`, it resolves the matching API key from the loaded keys map. Session IDs are cached per API key for the lifetime of the process — `Authenticate` is only called once per key, not once per tool call.\n\n> **Note:** Parameter casing differs across Yuki's services — `sessionId` (lowercase d) on `Sales.asmx` and `Purchase.asmx`; `sessionID` (uppercase D) on `Accounting.asmx`, `AccountingInfo.asmx`, `Contact.asmx`, and `Archive.asmx`. This is handled per-tool.\n\n### XML documents\n\nWrite tools (`process_sales_invoice`, `process_purchase_invoice`, `process_journal`, `upsert_contact`) pass structured data to Yuki as an XML string inside the `xmlDoc` SOAP parameter. The `XmlValue` wrapper ensures this XML is embedded raw (not entity-encoded) in the SOAP envelope. All user-supplied values are XML-escaped via `escapeXml()`.\n\n---\n\n## Rate limits\n\nYuki enforces **1,000 API requests per day** (upgradeable to 5,000–10,000). Each tool call is 1 request. Session IDs are cached so `Authenticate` is only called once per API key per server process, not once per tool call.\n\nDesign agent workflows to fetch broad lists once and reference them from the agent's context window rather than re-fetching on every step.\n\n---\n\n## Troubleshooting\n\n| Error | Likely cause |\n|-------|-------------|\n| **Server disconnected** with no further output | The MCP host could not start the server. Desktop hosts don't inherit your shell's `PATH`, so use absolute paths (`which npx` / `which node`). With package versions up to 1.6.0, `npx` also fails with `could not determine executable to run` because the package had no `bin` entry — upgrade, or run `node` against `dist/index.js` |\n| `get_missing_invoices` returns `count: 0` while Yuki shows missing invoices | Your administration reports a `<Type>` label the tool doesn't recognise — check `typesSeen` in the response and pass the bank-side labels via the `types` parameter |\n| `SOAP Fault: Authentication failed` | `YUKI_API_KEY` is incorrect or API access is not enabled in Yuki Settings |\n| `No API key found for administration …` | The `administrationId` passed to the tool is not in the loaded keys file — check `YUKI_API_KEYS_FILE` |\n| `API keys file at … is not valid JSON` | The keys file exists but does not parse — look for a trailing comma or stray character. The file must be a single JSON object mapping `administrationId` → key |\n| `SOAP Fault: Administration not found` | Wrong `administrationId` — run `get_administrations` to get the correct GUID |\n| `Journal entries do not balance` | Amounts in `process_journal` don't sum to 0 — check debit/credit signs |\n| `HTTP 500 from api.yukiworks.nl` | Usually a wrong XML namespace or malformed `xmlDoc` — check the WSDL at `https://api.yukiworks.nl/ws/{Service}.asmx?wsdl` |\n| `File does not appear to be a PDF` | The file at `filePath` does not start with the `%PDF` magic bytes — check you're pointing at a valid PDF |\n| `File not found` | `filePath` passed to `upload_document_from_path` does not exist or is inaccessible |\n| `Network error` | No connectivity to `api.yukiworks.nl` — requests time out after 30 seconds |\n\n---\n\n## About CodeMill Solutions\n\n[CodeMill Solutions](https://codemill.dev/en/) is a Dutch software company based in the Netherlands. We build smart, scalable, and customized solutions that help organizations grow, optimize processes, and realize their digital ambitions.\n\nOur services include:\n\n- **Custom applications** — portals, dashboards, business software, and fully tailored platforms that truly add value.\n- **API integrations** — connecting your application with other systems and external platforms via smart API connections.\n- **Mobile apps** — iOS and Android apps as a logical extension of your web application(s).\n\n`yuki-mcp` is one of our open-source integrations, making Yuki's accounting platform accessible to AI agents through the Model Context Protocol.\n\n📧 [info@codemill.dev](mailto:info@codemill.dev)\n🌐 [codemill.dev](https://codemill.dev/en/)\n💼 [LinkedIn](https://www.linkedin.com/company/codemill-solutions/)\n🐙 [GitHub](https://github.com/CodeMill-Solutions)\n\n---\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n","readmeFilename":"README.md"}