{"_id":"@energio/holded-mcp","_rev":"9-07a7f3b0eb9801a18db6ae4267fef8b7","name":"@energio/holded-mcp","dist-tags":{"latest":"1.5.1"},"versions":{"1.0.0":{"name":"@energio/holded-mcp","version":"1.0.0","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.0.0","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"cf9acd064fb89c8fa2daee57099c051ee9306c84","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.0.0.tgz","fileCount":243,"integrity":"sha512-L5UXWOifl9m3JobGNVn2JegJ5a4hi/0uQdmdwfFW0u0jkpi1o4I5D4WtLruNABBaiVVoLND2v9bc6V/e+Aa/hA==","signatures":[{"sig":"MEUCIQDy+RDaxM5qZZ7H8MjxjpJ8QyvBEMO9zT9Wf6O89Apc6QIgE7T8DHO0Ap7Im9l26sDf64Hl4qb+ozrvK+ohimZTPuI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":745661},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"6f0ee5489feac6b43609acf09bd404b334586953","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.0.0_1774960497118_0.539530974366426","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@energio/holded-mcp","version":"1.1.0","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.1.0","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"9999fa19e6decb237b19124f011cda9cbd918120","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.1.0.tgz","fileCount":251,"integrity":"sha512-XxHH4YuRPCxEN7XhBzOgz77Qf1tvf1GXpoC2CJS1tlFJvkxg38AwGQXCPnkU3weVPqZUOo04dogilQMaJCNnxg==","signatures":[{"sig":"MEQCIE4iDyEr66RLsV9WA2F55IdwW7yglgDhtwZblku3+pEiAiB4n7q4GbCQZ7KnHczB1ncvCLDSwkJNM1OHt4Mq1XbGCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":758755},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"d5a7737228839c21137c30986f0c3cc754262e49","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.1.0_1774976220424_0.8624957158179796","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@energio/holded-mcp","version":"1.1.1","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.1.1","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"dc9d8aaa5b7d5a0471d9adb9fc6ce51c8209f02e","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.1.1.tgz","fileCount":251,"integrity":"sha512-mW9jQGw2tau9qP1KufBNfjdrtd0S9fvsDO97qwHnN0drBRpeVXkF0RXqYDp6QfdviUz1irs0t251iN5+tq5pRA==","signatures":[{"sig":"MEQCIEs0OTyfiDLYauQvf3pczeKEMnWewic+0HHhI8sRpjcLAiB+Fk8uHw1yYZjIxmq/0jasqEUjSQO2J91n+mchR2yGPg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":758759},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"15f3b487895803b129abf4509e6e9998f5084f8f","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.1.1_1774976754798_0.03187060769493599","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@energio/holded-mcp","version":"1.2.0","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.2.0","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"ff9528dbbc75f9acdda16f48af3d563244bb3666","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.2.0.tgz","fileCount":251,"integrity":"sha512-vRnfXCxKXMWSqe8QQJTae3J+QSWhsPBm+QJ2SFmtf3W+0ZIcEHNCMyqJpK5AusUznIBu6iGcN1gcPWWgFSJBeg==","signatures":[{"sig":"MEUCIBZWFnI24MVDytACKwLG7kaFikvhpwztfO+0doZuYYAYAiEA0o/se/82WNgkq2qP6o8spi04DtovYzeM+SjjKVwxNjg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":761401},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"cc4b2cf49de4906afd72a79ffde6473de53eef22","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.2.0_1775340941253_0.9377892059498885","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@energio/holded-mcp","version":"1.2.1","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.2.1","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"2319f8911124407beb076fa26a54b7db18506880","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.2.1.tgz","fileCount":251,"integrity":"sha512-WeSS14FC+p9Pza5FawCmVlcL52tv4o9qVH6D+QKGHm869aGiyheNhZYX7dK8bNJus/OhICM22Gor9MzhD8H3RQ==","signatures":[{"sig":"MEUCIDlZ1kAz3Dxw062REujQgvkNMRPn1bJip2x75zYtz2jSAiEAo9FVgndGXTUlEvZzCqwmyaqq6mqqsBFEQdx6P8g3jtY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":761401},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"190b8daf23c701e58c8015693c77cb7091cbf869","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.2.1_1775778059111_0.32104879035219747","host":"s3://npm-registry-packages-npm-production"}},"1.3.0":{"name":"@energio/holded-mcp","version":"1.3.0","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.3.0","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"61d341e1c9f1ed1193ab706fbdafdb5e9a91af43","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.3.0.tgz","fileCount":259,"integrity":"sha512-F7WTqA30qMyM+6zG5SiXZNiAmYkM0NXveF67yqgNfo7W3iEotswRWVReC+yyHyhMfyZ1xsy4UwuqfSHdThAKPQ==","signatures":[{"sig":"MEQCIALav01p3MfL1Brmnze3st9ik209lrwJRUgajZonFmZDAiAPqAsgxX+sVh58u/henJPjjuu+QMuKcZH0W/NW2qr1tA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":772601},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"4f4e84067d3f0657b4a74fb940e92d26339afe09","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.3.0_1776359582941_0.46547847878789383","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@energio/holded-mcp","version":"1.4.0","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.4.0","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"aba3dc5fbc3df5cb4e0b26f5fc1398e28e67ecba","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.4.0.tgz","fileCount":263,"integrity":"sha512-fDWHpODukbMrYHbEB5TWq1VsKg6YxkfM2+7uMj0B2Hv3ZUNRGdXLexA4Y3flZtsVoEfBKKCuqT4vEkn+9EppNg==","signatures":[{"sig":"MEQCIGLC1ixNf6c1XnwitTS9hSN9cLofEUh/BO5rEcaXb797AiBN3sdA7vSoMW3JUM4qVg4xi/olj1Z0Ub6fKFjS8UddOw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":790924},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"ebea9f6d541892f2f6024ebff25fef3d4289b97d","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.4.0_1776441853236_0.6294079846571607","host":"s3://npm-registry-packages-npm-production"}},"1.5.0":{"name":"@energio/holded-mcp","version":"1.5.0","keywords":["holded","mcp","mcp-server","model-context-protocol"],"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","_id":"@energio/holded-mcp@1.5.0","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"homepage":"https://github.com/energio-es/holded-mcp#readme","bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"bin":{"holded-mcp":"dist/index.js"},"dist":{"shasum":"a7ef4f45f6445a116cbd214741ccfc3af0059912","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.5.0.tgz","fileCount":263,"integrity":"sha512-9l6EjGM0Z5XcvJrXzFwD/B4yJdPIedZ2OJlTc/XLTXFktyhJUiPh46vi6A5On4K7Qbakz4mxpevwjAQVuubgOQ==","signatures":[{"sig":"MEUCIQCRXNbPfx0Nb86SWYKLIuYGBInF8fQDuKqiaGURnHTVpAIgemHcCMnU6kEfufyO2Vjf+Emp3RJ6M2EZRWs1SYXw1UQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":796193},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"gitHead":"1a28d606c19a7ef76f56ce110489b97f87ea6147","mcpName":"io.github.energio-es/holded-mcp","scripts":{"dev":"tsx watch src/index.ts","test":"vitest run","build":"tsc","clean":"rm -rf dist","start":"node dist/index.js","test:smoke":"vitest run tests/smoke.test.ts","test:watch":"vitest","scrape-docs":"tsx scripts/scrape-all-docs.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"repository":{"url":"git+https://github.com/energio-es/holded-mcp.git","type":"git"},"_npmVersion":"11.4.2","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","directories":{},"_nodeVersion":"23.11.0","dependencies":{"zod":"^4.3.5","axios":"^1.14.0","form-data":"^4.0.5","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","devDependencies":{"tsx":"^4.19.4","jsdom":"^27.4.0","eslint":"^9.39.4","vitest":"^3.2.4","js-yaml":"^4.1.1","@eslint/js":"^9.39.4","playwright":"^1.58.2","typescript":"^5.9.3","@types/node":"^22.19.15","@types/js-yaml":"^4.0.9","typescript-eslint":"^8.58.0"},"_npmOperationalInternal":{"tmp":"tmp/holded-mcp_1.5.0_1776674345114_0.9416884986063021","host":"s3://npm-registry-packages-npm-production"}},"1.5.1":{"name":"@energio/holded-mcp","version":"1.5.1","description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","type":"module","main":"dist/index.js","bin":{"holded-mcp":"dist/index.js"},"scripts":{"start":"node dist/index.js","dev":"tsx watch src/index.ts","build":"tsc","clean":"rm -rf dist","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","test:smoke":"vitest run tests/smoke.test.ts","prepublishOnly":"npm run build","scrape-docs":"tsx scripts/scrape-all-docs.ts"},"engines":{"node":">=20"},"keywords":["holded","mcp","mcp-server","model-context-protocol"],"mcpName":"io.github.energio-es/holded-mcp","author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/energio-es/holded-mcp.git"},"bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"homepage":"https://github.com/energio-es/holded-mcp#readme","publishConfig":{"access":"public"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","axios":"^1.14.0","form-data":"^4.0.5","zod":"^4.3.5"},"devDependencies":{"@eslint/js":"^9.39.4","@types/js-yaml":"^4.0.9","@types/node":"^22.19.15","eslint":"^9.39.4","js-yaml":"^4.1.1","jsdom":"^27.4.0","playwright":"^1.58.2","tsx":"^4.19.4","typescript":"^5.9.3","typescript-eslint":"^8.58.0","vitest":"^3.2.4"},"packageManager":"npm@11.4.2+sha512.f90c1ec8b207b625d6edb6693aef23dacb39c38e4217fe8c46a973f119cab392ac0de23fe3f07e583188dae9fd9108b3845ad6f525b598742bd060ebad60bff3","_id":"@energio/holded-mcp@1.5.1","types":"./dist/index.d.ts","_nodeVersion":"26.4.0","_npmVersion":"11.4.2","dist":{"integrity":"sha512-DXUT6HVNeskrEuCeo5MWl0MDibEIe5y3ZQ+ujCJ3ILItmaqLWYqfM+caH2q54JIrrNcOwnwA8oBObST98Fx/Ig==","shasum":"fbdd9fad79370c8c58e05795a0773b94442da29e","tarball":"https://registry.npmjs.org/@energio/holded-mcp/-/holded-mcp-1.5.1.tgz","fileCount":263,"unpackedSize":795916,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIG3PIB9F96OCYzf6Hm+0W7h5rRZp+HONVP/h73DKS2xOAiBEHJTyVMILZ2foE0GFmoj43n8zDqc3A+ZioJ/HPDs2cg=="}]},"_npmUser":{"name":"baibaratsky","email":"andrei@baibaratsky.com"},"directories":{},"maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/holded-mcp_1.5.1_1782918093095_0.2603243433235505"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-31T12:34:57.032Z","modified":"2026-07-01T15:01:33.531Z","1.0.0":"2026-03-31T12:34:57.352Z","1.1.0":"2026-03-31T16:57:00.611Z","1.1.1":"2026-03-31T17:05:54.979Z","1.2.0":"2026-04-04T22:15:41.399Z","1.2.1":"2026-04-09T23:40:59.325Z","1.3.0":"2026-04-16T17:13:03.081Z","1.4.0":"2026-04-17T16:04:13.392Z","1.5.0":"2026-04-20T08:39:05.261Z","1.5.1":"2026-07-01T15:01:33.344Z"},"bugs":{"url":"https://github.com/energio-es/holded-mcp/issues"},"author":{"name":"Andrei Baybaratskiy","email":"andrei@energio.es"},"license":"MIT","homepage":"https://github.com/energio-es/holded-mcp#readme","keywords":["holded","mcp","mcp-server","model-context-protocol"],"repository":{"type":"git","url":"git+https://github.com/energio-es/holded-mcp.git"},"description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","maintainers":[{"name":"baibaratsky","email":"andrei@baibaratsky.com"}],"readme":"# Holded MCP Server\n\n[![npm version](https://img.shields.io/npm/v/@energio%2Fholded-mcp.svg)](https://www.npmjs.com/package/@energio/holded-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![CI](https://github.com/energio-es/holded-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/energio-es/holded-mcp/actions/workflows/ci.yml)\n[![Node.js Version](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](package.json)\n\nA Model Context Protocol (MCP) server for integrating with the Holded API. This server provides comprehensive access to Holded's business management platform, including invoicing, accounting, CRM, projects, and team functionality.\n\n## Table of Contents\n\n- [Features](#features)\n- [Installation](#installation)\n- [Configuration](#configuration)\n- [Usage](#usage)\n- [Available Tools](#available-tools)\n- [Document Types](#document-types)\n- [Response Formats](#response-formats)\n- [Error Handling](#error-handling)\n- [Performance](#performance)\n- [Development](#development)\n- [Contributing](#contributing)\n- [License](#license)\n- [Support](#support)\n\n## Features\n\n### Invoicing Module\n- **Documents**: Full CRUD operations for documents (invoices, estimates, purchases, etc.) plus pay, send, PDF export, tracking, and pipeline management\n- **Contacts**: Full CRUD operations for contacts and contact groups\n- **Products**: Manage products, variants, and stock levels\n- **Payments**: Full CRUD operations for payments\n- **Numbering Series**: Full CRUD operations for document numbering series\n- **Treasury**: Create, list, and retrieve treasury/bank accounts\n- **Payment Methods**: List available payment methods\n- **Expenses Accounts**: Full CRUD operations for expenses accounts\n- **Sales Channels**: Full CRUD operations for sales channels\n- **Services**: Full CRUD operations for services\n- **Taxes**: Get tax information and rates\n- **Warehouses**: Full CRUD operations for warehouses\n\n### CRM Module\n- **Leads**: Create, list, get, update, delete leads; manage stages, notes, and tasks\n- **Funnels**: Full CRUD operations for sales funnels with custom stages\n- **Events**: Full CRUD operations for CRM events\n- **Bookings**: Full CRUD operations for bookings and manage locations\n\n### Projects Module\n- **Projects**: Full CRUD operations for projects plus project summaries\n- **Tasks**: Full CRUD operations for project tasks\n- **Time Tracking**: Full CRUD operations for project time tracking entries\n\n### Accounting Module\n- **Accounts**: List and create accounting accounts with prefix-based numbering\n- **Daily Ledger**: List daily ledger entries and create accounting entries\n\n### Team Module\n- **Employees**: Full CRUD operations for employees\n- **Time Tracking**: List all time trackings, list by employee, get, create, update, and delete time tracking entries\n\n## Installation\n\n### Prerequisites\n\n1. **Node.js** >= 20 (check with `node --version`)\n2. **Holded API Key** - Get yours from [Holded API Settings](https://app.holded.com/api) or go to Configuration (top bar) → API\n\n### Quick Start (npx)\n\nThe easiest way to use this MCP server is via `npx` - no installation or build required! Just configure your MCP client as shown below.\n\n### Setup for Claude Desktop\n\nAdd the following to your Claude Desktop configuration file:\n\n- **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows**: `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"holded\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@energio/holded-mcp\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop to load the server.\n\n### Setup for Claude Code\n\nAdd the server with a single command:\n\n```bash\nclaude mcp add holded -- npx -y @energio/holded-mcp\n```\n\nThen set the API key in your environment:\n\n```bash\nexport HOLDED_API_KEY=your_api_key_here\n```\n\n### Setup for Cursor\n\nAdd the following to your Cursor MCP settings file:\n\n- **macOS**: `~/.cursor/mcp.json`\n- **Windows**: `%APPDATA%\\Cursor\\mcp.json`\n- **Linux**: `~/.config/cursor/mcp.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"holded\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@energio/holded-mcp\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\"\n      }\n    }\n  }\n}\n```\n\nAfter saving, restart Cursor or reload the MCP servers from the settings.\n\n### Setup for VS Code\n\nAdd the following to your VS Code user settings (`settings.json`) or workspace settings (`.vscode/mcp.json`):\n\n**User settings (`settings.json`):**\n\n```json\n{\n  \"mcp\": {\n    \"servers\": {\n      \"holded\": {\n        \"command\": \"npx\",\n        \"args\": [\"-y\", \"@energio/holded-mcp\"],\n        \"env\": {\n          \"HOLDED_API_KEY\": \"your_api_key_here\"\n        }\n      }\n    }\n  }\n}\n```\n\n**Workspace settings (`.vscode/mcp.json`):**\n\n```json\n{\n  \"servers\": {\n    \"holded\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@energio/holded-mcp\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\"\n      }\n    }\n  }\n}\n```\n\n### Setup for Windsurf\n\nAdd the following to your Windsurf MCP configuration file:\n\n- **macOS**: `~/.codeium/windsurf/mcp_config.json`\n- **Windows**: `%APPDATA%\\Codeium\\windsurf\\mcp_config.json`\n- **Linux**: `~/.codeium/windsurf/mcp_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"holded\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@energio/holded-mcp\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\"\n      }\n    }\n  }\n}\n```\n\n### Setup for Other MCP-Compatible Agents\n\nAny MCP-compatible agent can use this server via npx. The general configuration requires:\n\n1. **Command**: `npx`\n2. **Arguments**: `[\"-y\", \"@energio/holded-mcp\"]`\n3. **Environment variable**: `HOLDED_API_KEY` with your API key\n\nExample configuration:\n\n```json\n{\n  \"mcpServers\": {\n    \"holded\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@energio/holded-mcp\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\"\n      }\n    }\n  }\n}\n```\n\nThe server communicates via stdio using the MCP protocol and can be integrated with any client that supports the [Model Context Protocol](https://modelcontextprotocol.io/).\n\n## Configuration\n\nThe server requires a `HOLDED_API_KEY` environment variable. This is typically set in your MCP client configuration (see installation sections above).\n\nFor manual/development usage, you can set it directly:\n\n```bash\nexport HOLDED_API_KEY=your_api_key_here\n```\n\n### Module Selection\n\nBy default, all modules are enabled. To load only specific modules, set the `HOLDED_MODULES` environment variable with a comma-separated list:\n\n**Available modules**: `invoicing`, `crm`, `projects`, `accounting`, `team`\n\nExample - enable only invoicing module:\n\n```json\n{\n  \"mcpServers\": {\n    \"holded\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@energio/holded-mcp\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\",\n        \"HOLDED_MODULES\": \"invoicing\"\n      }\n    }\n  }\n}\n```\n\n**Configuration examples**:\n\n- **All modules (default)**: Omit `HOLDED_MODULES` or leave it empty\n- **Only CRM**: `\"HOLDED_MODULES\": \"crm\"`\n- **Only invoicing**: `\"HOLDED_MODULES\": \"invoicing\"`\n- **Multiple modules**: `\"HOLDED_MODULES\": \"invoicing,crm\"`\n\n### Debug Mode\n\nEnable debug logging for API requests and retries by setting the `HOLDED_DEBUG` environment variable:\n\n```json\n{\n  \"mcpServers\": {\n    \"holded\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@energio/holded-mcp\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\",\n        \"HOLDED_DEBUG\": \"true\"\n      }\n    }\n  }\n}\n```\n\nWhen enabled, the server will log retry attempts and API request failures to stderr, which can be helpful for troubleshooting connection issues or rate limiting.\n\n## Usage\n\n### Running the Server Manually\n\n```bash\nnpm start\n```\n\nOr for development with auto-reload:\n\n```bash\nnpm run dev\n```\n\n**Note**: In most cases, you won't run the server manually. Your MCP client (Cursor, Claude Desktop, etc.) will start and manage the server process automatically based on your configuration.\n\n## Available Tools\n\n### Contact Tools\n- `holded_invoicing_list_contacts` - List all contacts\n- `holded_invoicing_get_contact` - Get a specific contact\n- `holded_invoicing_create_contact` - Create a new contact\n- `holded_invoicing_update_contact` - Update a contact\n- `holded_invoicing_delete_contact` - Delete a contact\n- `holded_invoicing_list_contact_groups` - List contact groups\n- `holded_invoicing_get_contact_group` - Get a contact group\n- `holded_invoicing_create_contact_group` - Create a contact group\n- `holded_invoicing_update_contact_group` - Update a contact group\n- `holded_invoicing_delete_contact_group` - Delete a contact group\n- `holded_invoicing_list_contact_attachments` - List attachments for a contact\n- `holded_invoicing_get_contact_attachment` - Get a specific contact attachment\n\n### Product Tools\n- `holded_invoicing_list_products` - List all products\n- `holded_invoicing_get_product` - Get a specific product\n- `holded_invoicing_create_product` - Create a new product\n- `holded_invoicing_update_product` - Update a product\n- `holded_invoicing_delete_product` - Delete a product\n- `holded_invoicing_list_products_stock` - List product stock levels for a specific warehouse\n- `holded_invoicing_update_product_stock` - Update product stock\n- `holded_invoicing_get_product_image` - Get main product image\n- `holded_invoicing_list_product_images` - List all product images\n- `holded_invoicing_get_product_secondary_image` - Get a secondary product image\n- `holded_invoicing_upload_product_image` - Upload an image to a product (accepts `file_path` for large files; `file_content` base64 still supported)\n\n### Document Tools\n- `holded_invoicing_list_documents` - List documents by type\n- `holded_invoicing_get_document` - Get a specific document\n- `holded_invoicing_create_document` - Create a new document\n- `holded_invoicing_update_document` - Update a document\n- `holded_invoicing_delete_document` - Delete a document\n- `holded_invoicing_pay_document` - Record a payment for a document\n- `holded_invoicing_send_document` - Send a document via email\n- `holded_invoicing_get_document_pdf` - Get PDF version of a document\n- `holded_invoicing_update_document_tracking` - Update document tracking info\n- `holded_invoicing_update_document_pipeline` - Update document pipeline stage\n- `holded_invoicing_ship_all_items` - Ship all items from a sales order\n- `holded_invoicing_ship_items_by_line` - Ship specific items by line from a sales order\n- `holded_invoicing_get_shipped_items` - Get shipped items for a document\n- `holded_invoicing_attach_document_file` - Attach a file to a document (accepts `file_path` for large files; `file_content` base64 still supported)\n\n### Payment & Treasury Tools\n- `holded_invoicing_list_payments` - List all payments\n- `holded_invoicing_get_payment` - Get a specific payment\n- `holded_invoicing_create_payment` - Create a payment\n- `holded_invoicing_update_payment` - Update a payment\n- `holded_invoicing_delete_payment` - Delete a payment\n- `holded_invoicing_get_numbering_series` - Get numbering series by type\n- `holded_invoicing_create_numbering_serie` - Create a numbering series\n- `holded_invoicing_update_numbering_serie` - Update a numbering series\n- `holded_invoicing_delete_numbering_serie` - Delete a numbering series\n- `holded_invoicing_create_treasury` - Create a treasury account\n- `holded_invoicing_list_treasuries` - List treasury accounts\n- `holded_invoicing_get_treasury` - Get a treasury account\n- `holded_invoicing_list_payment_methods` - List available payment methods\n\n### Expenses Account Tools\n- `holded_invoicing_list_expenses_accounts` - List all expenses accounts\n- `holded_invoicing_get_expenses_account` - Get a specific expenses account\n- `holded_invoicing_create_expenses_account` - Create a new expenses account\n- `holded_invoicing_update_expenses_account` - Update an expenses account\n- `holded_invoicing_delete_expenses_account` - Delete an expenses account\n\n### Sales Channel Tools\n- `holded_invoicing_list_sales_channels` - List all sales channels\n- `holded_invoicing_get_sales_channel` - Get a specific sales channel\n- `holded_invoicing_create_sales_channel` - Create a new sales channel\n- `holded_invoicing_update_sales_channel` - Update a sales channel\n- `holded_invoicing_delete_sales_channel` - Delete a sales channel\n\n### Services Tools\n- `holded_invoicing_list_services` - List all services\n- `holded_invoicing_get_service` - Get a specific service\n- `holded_invoicing_create_service` - Create a new service\n- `holded_invoicing_update_service` - Update a service\n- `holded_invoicing_delete_service` - Delete a service\n\n### Remittances Tools\n- `holded_invoicing_list_remittances` - List all remittances\n- `holded_invoicing_get_remittance` - Get a specific remittance\n\n### Taxes Tools\n- `holded_invoicing_get_taxes` - Get all taxes information\n\n### Warehouse Tools\n- `holded_invoicing_list_warehouses` - List all warehouses\n- `holded_invoicing_get_warehouse` - Get a specific warehouse\n- `holded_invoicing_create_warehouse` - Create a new warehouse\n- `holded_invoicing_update_warehouse` - Update a warehouse\n- `holded_invoicing_delete_warehouse` - Delete a warehouse\n\n### CRM Tools\n\n#### Lead Tools\n- `holded_crm_list_leads` - List all leads\n- `holded_crm_get_lead` - Get a specific lead\n- `holded_crm_create_lead` - Create a new lead\n- `holded_crm_update_lead` - Update a lead\n- `holded_crm_delete_lead` - Delete a lead\n- `holded_crm_update_lead_stage` - Move lead to a different stage\n- `holded_crm_list_lead_notes` - List all notes for a lead\n- `holded_crm_create_lead_note` - Add a note to a lead\n- `holded_crm_update_lead_note` - Update a lead note\n- `holded_crm_list_lead_tasks` - List all tasks for a lead\n- `holded_crm_create_lead_task` - Create a task for a lead\n- `holded_crm_update_lead_task` - Update a lead task\n- `holded_crm_delete_lead_task` - Delete a lead task\n- `holded_crm_update_lead_dates` - Update lead dates\n\n#### Funnel Tools\n- `holded_crm_list_funnels` - List all funnels\n- `holded_crm_get_funnel` - Get a specific funnel\n- `holded_crm_create_funnel` - Create a funnel\n- `holded_crm_update_funnel` - Update a funnel\n- `holded_crm_delete_funnel` - Delete a funnel\n\n#### Event Tools\n- `holded_crm_list_events` - List all events\n- `holded_crm_get_event` - Get a specific event\n- `holded_crm_create_event` - Create an event\n- `holded_crm_update_event` - Update an event\n- `holded_crm_delete_event` - Delete an event\n\n#### Booking Tools\n- `holded_crm_list_bookings` - List all bookings\n- `holded_crm_get_booking` - Get a specific booking\n- `holded_crm_create_booking` - Create a booking\n- `holded_crm_update_booking` - Update a booking\n- `holded_crm_delete_booking` - Delete/cancel a booking\n- `holded_crm_list_booking_locations` - List booking locations\n- `holded_crm_get_available_slots` - Get available booking slots\n\n### Project Tools\n- `holded_projects_list_projects` - List all projects\n- `holded_projects_get_project` - Get a specific project\n- `holded_projects_create_project` - Create a project\n- `holded_projects_update_project` - Update a project\n- `holded_projects_delete_project` - Delete a project\n- `holded_projects_get_project_summary` - Get project summary/overview\n- `holded_projects_list_tasks` - List all tasks\n- `holded_projects_get_task` - Get a specific task\n- `holded_projects_create_task` - Create a task\n- `holded_projects_delete_task` - Delete a task\n\n### Project Time Tracking Tools\n- `holded_projects_list_project_time_trackings` - List all time trackings for a project\n- `holded_projects_get_project_time_tracking` - Get a specific project time tracking entry\n- `holded_projects_create_project_time_tracking` - Create a time tracking entry for a project\n- `holded_projects_update_project_time_tracking` - Update a project time tracking entry\n- `holded_projects_delete_project_time_tracking` - Delete a project time tracking entry\n- `holded_projects_list_all_times` - List all time trackings across all projects\n\n### Accounting Tools\n- `holded_accounting_list_accounts` - List all accounting accounts (chart of accounts/PGC accounts)\n- `holded_accounting_get_account` - Get a specific accounting account\n- `holded_accounting_create_account` - Create an accounting account\n- `holded_accounting_update_account` - Update an accounting account\n- `holded_accounting_delete_account` - Delete an accounting account\n- `holded_accounting_list_daily_ledger` - List daily ledger entries\n- `holded_accounting_create_entry` - Create a daily ledger entry\n\n### Team Tools\n\n#### Employee Tools\n- `holded_team_list_employees` - List all employees\n- `holded_team_get_employee` - Get a specific employee\n- `holded_team_create_employee` - Create a new employee\n- `holded_team_update_employee` - Update an employee\n- `holded_team_delete_employee` - Delete an employee\n\n#### Time Tracking Tools\n- `holded_team_list_all_time_trackings` - List all time trackings for all employees\n- `holded_team_list_employee_time_trackings` - List all time trackings for a specific employee\n- `holded_team_get_time_tracking` - Get a specific time tracking entry\n- `holded_team_create_employee_time_tracking` - Create a time tracking entry for an employee\n- `holded_team_update_time_tracking` - Update a time tracking entry\n- `holded_team_delete_time_tracking` - Delete a time tracking entry\n- `holded_team_employee_clock_in` - Clock in an employee\n- `holded_team_employee_clock_out` - Clock out an employee\n- `holded_team_employee_pause` - Pause employee time tracking\n- `holded_team_employee_unpause` - Unpause employee time tracking\n\n## Document Types\n\nThe following document types are supported:\n- `invoice` - Sales invoices\n- `salesreceipt` - Sales receipts\n- `creditnote` - Sales refunds\n- `receiptnote` - Ticket sales refunds\n- `estimate` - Sales estimates/quotes\n- `salesorder` - Sales orders\n- `waybill` - Packing lists\n- `proform` - Proforma invoices\n- `purchase` - Purchases\n- `purchaserefund` - Purchase refunds\n- `purchaseorder` - Purchase orders\n\n## Response Formats\n\nAll tools support two response formats:\n- `json` (default) - Structured JSON data for programmatic processing\n- `markdown` - Human-readable formatted text\n\n## Error Handling\n\nThe server provides clear, actionable error messages for common scenarios:\n- Authentication errors (401) - Check your API key\n- Not found errors (404) - Verify resource IDs\n- Rate limiting (429) - Wait before retrying\n- Validation errors (422) - Check input parameters\n\n## Performance\n\nThis server provides 143 tools covering all Holded API modules. If you only need a subset of functionality, you can improve performance by enabling only the modules you need using the `HOLDED_MODULES` environment variable (see [Module Selection](#module-selection) above):\n\n- **Reduced token usage**: Fewer tool definitions means less context sent to the LLM\n- **Faster responses**: The model spends less time parsing available tools\n- **Lower costs**: Smaller prompts reduce API costs for token-based billing\n\nFor example, if you only work with invoicing, you can set `HOLDED_MODULES=invoicing` to disable CRM, Projects, Accounting, and Team modules.\n\n## Troubleshooting\n\n### Common Issues\n\n#### 1. API Key Not Found\n**Error**: `ERROR: HOLDED_API_KEY environment variable is required.`\n\n**Solution**: Ensure your API key is properly configured in your MCP client settings:\n- Check that `HOLDED_API_KEY` is set in the `env` section\n- Verify the key is correct (no extra spaces or quotes)\n- Get your API key from Configuration → API in Holded\n\n#### 2. 401 Unauthorized\n**Error**: API returns 401 status code\n\n**Solution**:\n- Verify your API key is valid and not expired\n- Check that the key has the necessary permissions\n- Regenerate the API key if needed\n\n#### 3. 422 Validation Error\n**Error**: API returns 422 status code\n\n**Solution**:\n- Check that all required parameters are provided\n- Verify parameter types match expectations (string vs number)\n- For nested objects (stock updates, custom fields), ensure correct structure\n\n#### 4. Module Not Loading\n**Error**: Tools from a specific module are missing\n\n**Solution**:\n- Check if you've set `HOLDED_MODULES` environment variable\n- If set, ensure the module name is included (e.g., `\"HOLDED_MODULES\": \"invoicing,crm\"`)\n- Remove `HOLDED_MODULES` or leave it empty to load all modules\n\n## Complex Operation Examples\n\n### Stock Updates\n\nUpdating product stock requires a nested object structure where you specify warehouse ID and product/variant IDs:\n\n```typescript\n// Stock update structure: stock[warehouseId][productId/variantId] = quantity\n{\n  \"product_id\": \"abc123\",\n  \"stock\": {\n    \"warehouse1\": {\n      \"productId1\": 100,\n      \"variantId1\": 50\n    },\n    \"warehouse2\": {\n      \"productId1\": 75\n    }\n  }\n}\n```\n\n**Example**: Set stock for product \"abc123\" to 100 units in warehouse \"wh1\":\n```typescript\n{\n  \"product_id\": \"abc123\",\n  \"stock\": {\n    \"wh1\": {\n      \"abc123\": 100\n    }\n  }\n}\n```\n\n### Booking Creation\n\nBookings require specific custom fields with key-value pairs:\n\n```typescript\n{\n  \"locationId\": \"location123\",\n  \"serviceId\": \"service456\",\n  \"dateTime\": 1730109600,  // Unix timestamp\n  \"timezone\": \"Europe/Madrid\",\n  \"language\": \"es\",\n  \"customFields\": [\n    {\n      \"key\": \"name\",\n      \"value\": \"John Doe\"\n    },\n    {\n      \"key\": \"email\",\n      \"value\": \"john@example.com\"\n    },\n    {\n      \"key\": \"phone\",\n      \"value\": \"+34612345678\"\n    }\n  ]\n}\n```\n\n### Task Creation\n\nTasks require both project ID and list ID (the list/column within the project):\n\n```typescript\n{\n  \"name\": \"New Task\",\n  \"project_id\": \"proj123\",\n  \"list_id\": \"list456\"  // Get this from project details\n}\n```\n\n**Note**: To get available list IDs, first fetch the project details using `holded_projects_get_project`.\n\n### Accounting Entries\n\nDaily ledger entries must have balanced debits and credits:\n\n```typescript\n{\n  \"date\": 1730109600,  // Unix timestamp\n  \"lines\": [\n    {\n      \"account\": 4300,  // Account number (integer)\n      \"debit\": 1000,\n      \"description\": \"Sales revenue\"\n    },\n    {\n      \"account\": 5700,  // Account number (integer)\n      \"credit\": 1000,\n      \"description\": \"Bank account\"\n    }\n  ],\n  \"notes\": \"Monthly sales entry\"\n}\n```\n\n**Requirements**:\n- Minimum 2 lines\n- Total debits must equal total credits\n- Each line must have either debit OR credit (not both)\n- Account numbers must be positive integers\n\n### Parameter Naming Convention\n\nThis MCP server uses a consistent parameter naming convention:\n\n- **Path/Query parameters**: Use `snake_case` (e.g., `employee_id`, `doc_type`)\n- **Request body fields**: Use `camelCase` matching the API (e.g., `lastName`, `sendInvite`)\n\nThe tool handlers automatically transform parameters to the format expected by the Holded API.\n\n### Custom fields\n\n> **Breaking in v1.4.0:** The `customFields` parameter shape changed from `[{field, value}]` to a flat `{key: value}` object. Replace each `[{field: \"k\", value: \"v\"}]` with `{\"k\": \"v\"}` in calls to `create_document`, `update_document`, `update_lead`, and `update_funnel`. Responses use the same map shape. The old array shape is rejected by the Zod schema.\n\nTools that accept or return `customFields` (documents, leads, funnels) use a flat `{key: value}` map:\n\n```json\n{\n  \"customFields\": {\n    \"source_path\": \"/tmp/invoice.pdf\",\n    \"source\": \"invoices-to-holded@v1/file\"\n  }\n}\n```\n\nThe server normalizes Holded's internal wire shape (which varies per endpoint and has a known bug in `POST /documents/{docType}` — see `holded_api_specs/DRIFT.md#DRIFT-INV-14`) so the map form round-trips consistently. On reads, previously-mangled records are repaired transparently.\n\n### Document API quirks\n\nA few Holded behaviors that affect `create_document` / `update_document` callers. The tool descriptions carry the full rule — this is a cross-reference for human developers:\n\n- **`items[].subtotal` is a per-unit price, not the line total.** Holded stores it as `products[i].price` and computes `line_total = price × units`. When `units > 1`, passing the line total silently over-books the document. Example: `{units: 40, subtotal: 100}` (not `subtotal: 4000`) for 40 hours × €100/hour.\n- **`items[].subtotal` meaning is asymmetric.** On create, it is in the document currency (Holded divides by `currencyChange` to store the EUR base). On update, it is the EUR base itself (stored verbatim). Re-passing values read from GET preserves state; passing invoice-currency values on update over-books the EUR total.\n- **`currencyChange` is immutable.** The Holded PUT endpoint silently drops the field. To change an invoice's exchange rate, delete and recreate with the new `currencyChange` at creation time. The `update_document` schema rejects the field as an unrecognized key (breaking change in v1.5.0).\n- **`applyContactDefaults` overrides line-level accounts.** When `items[].accountingAccountId` is set, you must pass `applyContactDefaults: false`. Otherwise the contact's default account silently wins. The `create_document` schema enforces this (breaking change in v1.5.0).\n\n## Workflow Examples\n\nThis section demonstrates common real-world workflows combining multiple API operations.\n\n### Creating a Complete Invoice\n\n```typescript\n// 1. First, ensure you have a contact\nconst contact = await holded_invoicing_create_contact({\n  name: \"Acme Corp\",\n  email: \"billing@acme.com\",\n  code: \"B12345678\"  // Tax ID\n});\n\n// 2. Create the invoice with line items\nconst invoice = await holded_invoicing_create_document({\n  doc_type: \"invoice\",\n  contactId: contact.id,\n  contactName: \"Acme Corp\",\n  date: 1730109600,  // Unix timestamp\n  items: [\n    {\n      name: \"Web Development Service\",\n      units: 40,\n      subtotal: 100,  // per-unit: 40 hours × €100/hour → line total €4,000\n      tax: 21  // 21% VAT\n    },\n    {\n      name: \"Hosting Service (Annual)\",\n      units: 1,\n      subtotal: 500,  // per-unit; units == 1 so line total is also €500\n      tax: 21\n    }\n  ],\n  notes: \"Payment due within 30 days\"\n});\n\n// 3. Send the invoice via email\nawait holded_invoicing_send_document({\n  doc_type: \"invoice\",\n  document_id: invoice.id,\n  emails: [\"billing@acme.com\"]\n});\n\n// 4. Record payment when received\nawait holded_invoicing_pay_document({\n  doc_type: \"invoice\",\n  document_id: invoice.id,\n  paid: 5445,  // Total with VAT (€4,500 × 1.21)\n  date: 1732701600  // Payment date\n});\n```\n\n### Managing Lead Lifecycle\n\n```typescript\n// 1. Create a new lead\nconst lead = await holded_crm_create_lead({\n  name: \"Enterprise Client Prospect\",\n  funnelId: \"funnel123\",\n  stageId: \"stage_initial_contact\",\n  contactName: \"Jane Smith\",\n  email: \"jane.smith@enterprise.com\",\n  phone: \"+34912345678\"\n});\n\n// 2. Add initial contact notes\nawait holded_crm_create_lead_note({\n  lead_id: lead.id,\n  note: \"Initial call: Interested in enterprise plan. Budget: €50k/year. Decision timeline: Q2 2026.\"\n});\n\n// 3. Create follow-up task\nawait holded_crm_create_lead_task({\n  lead_id: lead.id,\n  task: \"Send proposal and pricing\",\n  dueDate: 1730800000  // 1 week from now\n});\n\n// 4. Update lead stage after proposal sent\nawait holded_crm_update_lead_stage({\n  lead_id: lead.id,\n  stageId: \"stage_proposal_sent\"\n});\n\n// 5. Add proposal notes\nawait holded_crm_create_lead_note({\n  lead_id: lead.id,\n  note: \"Sent proposal via email. Includes: Enterprise tier, custom integrations, dedicated support.\"\n});\n\n// 6. When deal is won, convert to contact\nconst contact = await holded_invoicing_create_contact({\n  name: \"Enterprise Client Inc\",\n  email: \"jane.smith@enterprise.com\",\n  phone: \"+34912345678\"\n});\n\n// 7. Move lead to won stage\nawait holded_crm_update_lead_stage({\n  lead_id: lead.id,\n  stageId: \"stage_won\"\n});\n```\n\n### Employee Onboarding Workflow\n\n```typescript\n// 1. Create new employee\nconst employee = await holded_team_create_employee({\n  name: \"María\",\n  lastName: \"García\",\n  email: \"maria.garcia@company.com\",\n  sendInvite: true  // Sends email invitation\n});\n\n// 2. Update employee details after onboarding\nawait holded_team_update_employee({\n  employee_id: employee.id,\n  phone: \"+34666123456\",\n  mobile: \"+34666123456\",\n  dateOfBirth: \"15/03/1990\",\n  nationality: \"Spanish\",\n  iban: \"ES1234567890123456789012\",\n  address: {\n    address: \"Calle Mayor 123\",\n    city: \"Madrid\",\n    postalCode: \"28013\",\n    province: \"Madrid\",\n    country: \"Spain\"\n  },\n  workplace: \"office_madrid_001\",\n  teams: [\"team_engineering\", \"team_backend\"]\n});\n\n// 3. Set up first time tracking entry\nawait holded_team_create_employee_time_tracking({\n  employee_id: employee.id,\n  startTmp: \"1730109600\",  // 9:00 AM (Unix timestamp as string)\n  endTmp: \"1730138400\"     // 5:00 PM (Unix timestamp as string)\n});\n\n// 4. Use clock-in/clock-out for daily tracking\nawait holded_team_employee_clock_in({\n  employee_id: employee.id,\n  location: \"Madrid Office\"\n});\n\n// Later in the day...\nawait holded_team_employee_clock_out({\n  employee_id: employee.id,\n  latitude: \"40.4168\",\n  longitude: \"-3.7038\"\n});\n```\n\n### Multi-Warehouse Stock Management\n\n```typescript\n// 1. Create warehouses\nconst warehouseMadrid = await holded_invoicing_create_warehouse({\n  name: \"Madrid Warehouse\",\n  address: {\n    address: \"Polígono Industrial Sur\",\n    city: \"Madrid\",\n    postalCode: \"28021\",\n    country: \"Spain\"\n  }\n});\n\nconst warehouseBarcelona = await holded_invoicing_create_warehouse({\n  name: \"Barcelona Warehouse\",\n  address: {\n    address: \"Zona Franca\",\n    city: \"Barcelona\",\n    postalCode: \"08040\",\n    country: \"Spain\"\n  }\n});\n\n// 2. Create a product\nconst product = await holded_invoicing_create_product({\n  name: \"Wireless Mouse MX Master\",\n  sku: \"TECH-MOUSE-001\",\n  price: 89.99,\n  tax: 21\n});\n\n// 3. Update stock across multiple warehouses\nawait holded_invoicing_update_product_stock({\n  product_id: product.id,\n  stock: {\n    [warehouseMadrid.id]: {\n      [product.id]: 150  // 150 units in Madrid\n    },\n    [warehouseBarcelona.id]: {\n      [product.id]: 200  // 200 units in Barcelona\n    }\n  }\n});\n\n// 4. Check stock levels for a specific warehouse\nconst madridStock = await holded_invoicing_list_products_stock({\n  warehouse_id: warehouseMadrid.id\n});\n\n// 5. Transfer stock between warehouses (reduce Madrid, increase Barcelona)\nawait holded_invoicing_update_product_stock({\n  product_id: product.id,\n  stock: {\n    [warehouseMadrid.id]: {\n      [product.id]: 125  // Reduced by 25\n    },\n    [warehouseBarcelona.id]: {\n      [product.id]: 225  // Increased by 25\n    }\n  }\n});\n```\n\n### Document Shipping Workflow\n\n```typescript\n// 1. Create a sales order\nconst salesOrder = await holded_invoicing_create_document({\n  doc_type: \"salesorder\",\n  contactId: \"contact123\",\n  contactName: \"Tech Store SL\",\n  date: 1730109600,\n  items: [\n    {\n      name: \"Laptop HP ProBook\",\n      sku: \"LAPTOP-HP-001\",\n      units: 5,\n      subtotal: 700,  // per-unit: €700 × 5 units → line total €3,500\n      tax: 21\n    },\n    {\n      name: \"USB-C Dock\",\n      sku: \"DOCK-USBC-001\",\n      units: 5,\n      subtotal: 100,  // per-unit: €100 × 5 units → line total €500\n      tax: 21\n    }\n  ],\n  warehouseId: \"warehouse_madrid_001\"\n});\n\n// 2. Add tracking information\nawait holded_invoicing_update_document_tracking({\n  doc_type: \"salesorder\",\n  document_id: salesOrder.id,\n  carrier: \"DHL Express\",\n  trackingNumber: \"1234567890\",\n  trackingUrl: \"https://dhl.com/track/1234567890\"\n});\n\n// 3. Ship all items at once\nconst shipment = await holded_invoicing_ship_all_items({\n  document_id: salesOrder.id\n});\n\n// Alternative: Ship items line by line (partial shipments)\n// await holded_invoicing_ship_items_by_line({\n//   document_id: salesOrder.id,\n//   lines: [\n//     { lineId: \"line1\", units: 3 },  // Ship 3 laptops now\n//     { lineId: \"line2\", units: 5 }   // Ship all docks now\n//   ]\n// });\n\n// 4. Check shipped items\nconst shippedItems = await holded_invoicing_get_shipped_items({\n  doc_type: \"salesorder\",\n  document_id: salesOrder.id\n});\n\n// 5. Update pipeline stage\nawait holded_invoicing_update_document_pipeline({\n  doc_type: \"salesorder\",\n  document_id: salesOrder.id,\n  pipelineStage: \"shipped\"\n});\n\n// 6. Create invoice from the sales order\nconst invoice = await holded_invoicing_create_document({\n  doc_type: \"invoice\",\n  contactId: \"contact123\",\n  salesorderId: salesOrder.id,  // Link to sales order\n  date: 1730196000\n});\n```\n\n## Development\n\n### Build from Source\n\nIf you want to build from source (for development or contributions):\n\n```bash\ngit clone https://github.com/energio-es/holded-mcp.git\ncd holded-mcp\nnpm install\nnpm run build\n```\n\nThen use the built server in your MCP client configuration:\n\n```json\n{\n  \"mcpServers\": {\n    \"holded\": {\n      \"command\": \"node\",\n      \"args\": [\"/absolute/path/to/holded-mcp/dist/index.js\"],\n      \"env\": {\n        \"HOLDED_API_KEY\": \"your_api_key_here\"\n      }\n    }\n  }\n}\n```\n\n### Development Commands\n\n```bash\n# Install dependencies\nnpm install\n\n# Build TypeScript\nnpm run build\n\n# Run in development mode with auto-reload\nnpm run dev\n\n# Clean build artifacts\nnpm run clean\n```\n\n## Contributing\n\nContributions are welcome! Please read our [Contributing Guide](CONTRIBUTING.md) for details on the process for submitting pull requests.\n\n### Quick Start for Contributors\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Commit using [Conventional Commits](https://www.conventionalcommits.org/) (`git commit -m 'feat: add amazing feature'`)\n5. Push to your branch (`git push origin feature/amazing-feature`)\n6. Open a Pull Request\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Community & Governance\n\n- [Code of Conduct](CODE_OF_CONDUCT.md)\n- [Governance](GOVERNANCE.md)\n- [Security Policy](SECURITY.md)\n\n## Support\n\n- **Holded API Documentation**: https://developers.holded.com/reference\n- **Issues**: [GitHub Issues](https://github.com/energio-es/holded-mcp/issues) - *Response time: 1-2 weeks*\n- **Discussions**: [GitHub Discussions](https://github.com/energio-es/holded-mcp/discussions)\n- **Security**: [Report a Vulnerability](SECURITY.md) - *Response time: 72 hours*\n\n","readmeFilename":"README.md"}