{"_id":"@aexol-studio/basecamp-to-llm","_rev":"11-81e4c10c8c5b2488097d303bb10e5cb5","name":"@aexol-studio/basecamp-to-llm","dist-tags":{"latest":"2.0.5"},"versions":{"1.0.0":{"name":"@aexol-studio/basecamp-to-llm","version":"1.0.0","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.0.0","maintainers":[{"name":"aexol-office","email":"office@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"0254de9ed0cd84f9eca6f762426c61d364b6a26c","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.0.0.tgz","fileCount":29,"integrity":"sha512-/y9G2lz0reJ7uBbkQi/sfqd7h0DHwzAa30OMGQIeou3HpCGw//k/8WdKGPOQQv5PIW/Vt8fqi1IC94585Y7p2g==","signatures":[{"sig":"MEUCIQCwAPFug2hY1heUXPi9hFUfUHTv0WbNnCazQgN0LyT1OQIgKrdM9eipK8V0jgXZNVbb6paG14ooahuP3Td9Q6ASj2k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":75097},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"aba05abe33f5f3173c267f11b8d95e0e079eb53e","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","example":"tsx examples/basic-usage.ts","prepare":"npm run build","lint:fix":"eslint src --ext .ts --fix","setup-mcp":"node scripts/setup-mcp.js","example:js":"node examples/basic-usage.js","test:watch":"jest --watch","example:mcp":"tsx examples/mcp-usage.ts","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"chalk":"^5.3.0","commander":"^11.1.0","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.6.0","jest":"^29.7.0","eslint":"^8.54.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.3.0","@types/jest":"^29.5.8","@types/node":"^20.10.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.0.0_1756556767701_0.4780879222999035","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aexol-studio/basecamp-to-llm","version":"1.1.0","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.1.0","maintainers":[{"name":"aexol-office","email":"office@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"b9ed37cea8c27335837eca4256e1a32dc32c2ceb","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.1.0.tgz","fileCount":71,"integrity":"sha512-JYMrpKFFYzlyfVddesHl3tsFiSVwYJ5pSvCeYn9KbIdzRIBLDvGbygjOUvTltQ278gtWlASEEW/y3dvb543AOQ==","signatures":[{"sig":"MEQCIGzJvL6YiX4LfQlv2Rs2FkbYCKjg26LvLrak1Yrb2hejAiBMqXwZxLxypnAcORk+2FXL+Ow9/39iyA5K95JfrQ49+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":166098},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"56914c655ae813fcbd6fe20d02afada627825b73","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","example":"tsx examples/basic-usage.ts","prepare":"npm run build","lint:fix":"eslint src --ext .ts --fix","setup-mcp":"node scripts/setup-mcp.js","example:js":"node examples/basic-usage.js","test:watch":"jest --watch","example:mcp":"tsx examples/mcp-usage.ts","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run clean && npm run build","example:mcp-client":"node examples/mcp-client.mjs"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"chalk":"^5.3.0","commander":"^11.1.0","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.6.0","jest":"^29.7.0","eslint":"^8.54.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.3.0","@types/jest":"^29.5.8","@types/node":"^20.10.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.1.0_1756563773958_0.580417217677285","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@aexol-studio/basecamp-to-llm","version":"1.1.1","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.1.1","maintainers":[{"name":"aexol-office","email":"office@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"190692c08725e46c95ccabed9adc8669f56fbe42","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.1.1.tgz","fileCount":72,"integrity":"sha512-AYG3PvNvah4nLF7sSIifxbtGL1bHTG3X4euBvsc76IEPyS/GVYcyIEEuYQvZLOzIygdrpVzWOBsaljbNEu1Urw==","signatures":[{"sig":"MEQCIAb6apeVW3kRlasuTiC2q8dLjn7Cy0jwZZjRBGId3sb4AiB2p+tWOZ/dzAX6Xjkc5ZjF6ZpTH50nn618p4OhfhJgqQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170907},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"d4dc8d53c832a99bc34f0f6f28acb963aa7e879a","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","example":"tsx examples/basic-usage.ts","prepare":"npm run build","lint:fix":"eslint src --ext .ts --fix","setup-mcp":"node scripts/setup-mcp.js","example:js":"node examples/basic-usage.js","test:watch":"jest --watch","example:mcp":"tsx examples/mcp-usage.ts","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run clean && npm run build","example:live-lists":"tsx examples/live-list-check.ts","example:mcp-client":"node examples/mcp-client.mjs"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"chalk":"^5.3.0","commander":"^11.1.0","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.6.0","jest":"^29.7.0","eslint":"^8.54.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.3.0","@types/jest":"^29.5.8","@types/node":"^20.10.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.1.1_1756565946513_0.3661886197326971","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@aexol-studio/basecamp-to-llm","version":"1.1.2","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.1.2","maintainers":[{"name":"aexol-office","email":"office@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"0661d30c53ddd9c89ff028cce1a34a4b230b9fb6","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.1.2.tgz","fileCount":73,"integrity":"sha512-0W3ODB+wIWDzgC0bgU+Cgap5/MRnu9IrZMQLdJxC+sDxI+tUGJCAWYLSor3sZQ64dpnzKdi8Y5L+COaoAjVtBg==","signatures":[{"sig":"MEUCIQCmai3zyw2edti9+jywO2BhUxFZJofzwwmLRWsPxiWTNAIgW4B9A4cgiJiDyDzH5Bf0FBcilBSoiucLq2fDKKnkSlg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":173900},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"41a8d81577c5bf3fbce120baffc465e9aa10009a","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","example":"tsx examples/basic-usage.ts","prepare":"npm run build","lint:fix":"eslint src --ext .ts --fix","setup-mcp":"node scripts/setup-mcp.js","example:js":"node examples/basic-usage.js","test:watch":"jest --watch","example:mcp":"tsx examples/mcp-usage.ts","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run clean && npm run build","example:live-lists":"tsx examples/live-list-check.ts","example:mcp-client":"node examples/mcp-client.mjs"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"chalk":"^5.3.0","commander":"^11.1.0","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.6.0","jest":"^29.7.0","eslint":"^8.54.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.3.0","@types/jest":"^29.5.8","@types/node":"^20.10.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.1.2_1756567899886_0.6106678596993991","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aexol-studio/basecamp-to-llm","version":"1.2.0","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.2.0","maintainers":[{"name":"aexol-office","email":"office@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"81b1e499dffaf61bfc2e20d912ae1f391c01d0e4","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.2.0.tgz","fileCount":80,"integrity":"sha512-yotf0YuaCN+134rIidRzp3QRURMrtXcwTFUxpiV3t68UIWEIMFcWA+qWJ8RHFeZqa3kNQwkGJoDRXzeeaAOTOg==","signatures":[{"sig":"MEUCIDiHTjiSKe9HnXFPpgSreTxgKn5gwaIVo+TtW2Ead+5LAiEAmpE1kjy874ph47RTqUepnzckeD8B5aZjgkjNt2BP+Og=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":224842},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"1ff17a9eade636b1007bbfc1a4a785a1e7f55d91","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","example":"tsx examples/basic-usage.ts","prepare":"npm run build","lint:fix":"eslint src --ext .ts --fix","setup-mcp":"node scripts/setup-mcp.js","example:js":"node examples/basic-usage.js","test:watch":"jest --watch","example:mcp":"tsx examples/mcp-usage.ts","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run clean && npm run build","example:live-lists":"tsx examples/live-list-check.ts","example:mcp-client":"node examples/mcp-client.mjs"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"chalk":"^5.3.0","commander":"^11.1.0","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.6.0","jest":"^29.7.0","eslint":"^8.54.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.3.0","@types/jest":"^29.5.8","@types/node":"^20.10.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.2.0_1763562614036_0.7916469048995298","host":"s3://npm-registry-packages-npm-production"}},"1.3.1":{"name":"@aexol-studio/basecamp-to-llm","version":"1.3.1","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.3.1","maintainers":[{"name":"aexol-office","email":"office@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"58cc3e8ffafdbb918aa15d4e2354e0710f9591ac","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.3.1.tgz","fileCount":75,"integrity":"sha512-qvmFsNRFiuMeRa2PUMfwfjzqkgcDHUWlNrCkkDEHNVJbypKGcgouKCtv7IebLnMQdBDNACWOB0hrnmzoHEPEwg==","signatures":[{"sig":"MEUCIG7zAQPeSCrKuRUoWe95KtBs+XtkmaR59Rf7UPEumKJHAiEA9Cl+DdARtaYsDO324xkzGQ9ecIEoTHkgTe3fvMihSjw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208106},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ab5e351d23a60a723b4bc9d15fc7eef9f39f610c","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","example":"tsx examples/basic-usage.ts","prepare":"npm run build","lint:fix":"eslint src --ext .ts --fix","setup-mcp":"node scripts/setup-mcp.js","example:js":"node examples/basic-usage.js","test:watch":"jest --watch","example:mcp":"tsx examples/mcp-usage.ts","format:check":"prettier --check \"src/**/*.ts\"","prepublishOnly":"npm run clean && npm run build","example:live-lists":"tsx examples/live-list-check.ts","example:mcp-client":"node examples/mcp-client.mjs"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"chalk":"^5.3.0","commander":"^11.1.0","@modelcontextprotocol/sdk":"^0.4.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.6.0","jest":"^29.7.0","eslint":"^8.54.0","rimraf":"^5.0.5","ts-jest":"^29.1.1","prettier":"^3.1.0","typescript":"^5.3.0","@types/jest":"^29.5.8","@types/node":"^20.10.0","eslint-config-prettier":"^9.0.0","eslint-plugin-prettier":"^5.0.1","@typescript-eslint/parser":"^6.21.0","@typescript-eslint/eslint-plugin":"^6.21.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.3.1_1768819572873_0.7875422699376913","host":"s3://npm-registry-packages-npm-production"}},"1.3.2":{"name":"@aexol-studio/basecamp-to-llm","version":"1.3.2","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.3.2","maintainers":[{"name":"aexol-office","email":"office@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"3a1cd21734e295c140074c9e82de8caea0b8370c","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.3.2.tgz","fileCount":75,"integrity":"sha512-UYxovrqrO4IEOszh8t9QFWZVETfjV7Zchry3VRgikOR0ItmuHmbY/M+cWCN5lC9A+7/mMGQRTMtZcIkT/kAlfA==","signatures":[{"sig":"MEUCIQDTEayO8TChIzkwuTnpZM6pXdrx667BcBHljp8x6N9d8AIgF88Aitliuqw6v+g1NA16hGflImsnxDMeqmq+pt1wHQI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":183785},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"da9a522d253d3687487d7e26d4216bc877a2360b","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"jest","build":"tsc","clean":"rimraf dist","prepare":"npm run build","lint:fix":"eslint src --fix","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"zod":"^3.25.67","chalk":"^5.6.2","commander":"^14.0.3","@modelcontextprotocol/sdk":"^1.26.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","eslint":"^9.28.0","rimraf":"^6.1.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","typescript-eslint":"^8.55.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.55.0","@typescript-eslint/eslint-plugin":"^8.55.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.3.2_1771002679070_0.518063714589494","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@aexol-studio/basecamp-to-llm","version":"1.4.0","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.4.0","maintainers":[{"name":"aexol-office","email":"office@aexol.com"},{"name":"kamil-aexol","email":"kamil@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"9d981602c0ff1c01a119007081d43b377c97cf92","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.4.0.tgz","fileCount":75,"integrity":"sha512-HK8AUpLQrWPNCYibgKvUtedOqZl7pS9tag12A8cX3vjsin2o5Dbb3cLx3AFsyyZBdPAkgwvkGHk67ZEJo3PZow==","signatures":[{"sig":"MEYCIQCtPzmhFIrsSuYMgwEytl7zVU2nrjK6cM9Cp3iXPPDMygIhAM+CPjMR7I6s+qgaE+QW9LExMPa9zlcsXawZIEutSiQ4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":194940},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"0868a404e2842bc3f7c0caec227dccf6392dbd91","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"jest","build":"tsc","clean":"rimraf dist","prepare":"npm run build","lint:fix":"eslint src --fix","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"zod":"^3.25.67","chalk":"^5.6.2","commander":"^14.0.3","@modelcontextprotocol/sdk":"^1.26.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.21.0","jest":"^30.2.0","eslint":"^9.28.0","rimraf":"^6.1.2","ts-jest":"^29.4.6","prettier":"^3.8.1","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.2.3","typescript-eslint":"^8.55.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.5","@typescript-eslint/parser":"^8.55.0","@typescript-eslint/eslint-plugin":"^8.55.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.4.0_1781011028938_0.39915460608299","host":"s3://npm-registry-packages-npm-production"}},"1.4.1":{"name":"@aexol-studio/basecamp-to-llm","version":"1.4.1","keywords":["basecamp","cli","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@1.4.1","maintainers":[{"name":"aexol-office","email":"office@aexol.com"},{"name":"kamil-aexol","email":"kamil@aexol.com"}],"homepage":"https://github.com/aexol-studio/basecamp-to-llm#readme","bugs":{"url":"https://github.com/aexol-studio/basecamp-to-llm/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"556e4166cf3d643ba29d0689a55576e8ff5c092e","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-1.4.1.tgz","fileCount":75,"integrity":"sha512-41W/LcqvZ2T4nBHq/bixusWRoQC++ZjVoWd/6XE+/DJNX1LW09QTMDXi2kRXeTK5E8e087Tp0fKgUAM38XNdkA==","signatures":[{"sig":"MEQCIFA5KNhxsZaMaNEksMSFUqPLGhfwn5b2EcRKfQ+WZBg4AiAHAq8rRqFuq6JXBjNO0F+TgkGLYiFe6APMwFbcfkog9w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":195309},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"21675c100cfedadfacd683eb649f9d0b60891280","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"jest","build":"tsc","clean":"rimraf dist","prepare":"npm run build","lint:fix":"eslint src --fix","test:watch":"jest --watch","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"aexol-office","email":"office@aexol.com"},"repository":{"url":"git+https://github.com/aexol-studio/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.8.2","description":"CLI tool to fetch Basecamp todos and convert them to LLM-friendly task formats","directories":{},"_nodeVersion":"18.20.8","dependencies":{"zod":"^3.25.67","chalk":"^5.6.2","commander":"^14.0.3","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","jest":"^30.4.2","eslint":"^9.39.4","rimraf":"^6.1.3","ts-jest":"^29.4.11","prettier":"^3.8.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.9.2","typescript-eslint":"^8.61.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","@typescript-eslint/eslint-plugin":"^8.61.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_1.4.1_1781014642476_0.826525656293589","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"@aexol-studio/basecamp-to-llm","version":"2.0.4","keywords":["basecamp","mcp","model-context-protocol","cli","sdk","todos","tasks","llm","codex","project-management"],"author":{"name":"Aexol Studio"},"license":"MIT","_id":"@aexol-studio/basecamp-to-llm@2.0.4","maintainers":[{"name":"aexol-office","email":"office@aexol.com"},{"name":"kamil-aexol","email":"kamil@aexol.com"}],"homepage":"https://gitlab.aexol.com/aexol/basecamp-to-llm","bugs":{"url":"https://gitlab.aexol.com/aexol/basecamp-to-llm/-/issues"},"bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"dist":{"shasum":"5d406ae80a3de86a9cf220026a13bab0d1d3d81e","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-2.0.4.tgz","fileCount":75,"integrity":"sha512-DPCrHNe38dHBr/Ipgt5s5GmjlYChorRoGH9Jz2gvpFx0sZ3uXfXOtKDFIZ/F5DJNqXc+faQX1+WQnsjvmruzMQ==","signatures":[{"sig":"MEYCIQC5YLSCPQS8qEOCLqYzTb2oBRjxwnjaMRLK4zgwE7GiYwIhAP4r9X0Z9eCFeIMo37s7Rcfzt2fiFK46yHJm7Z+3Al4c","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":223896},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20.0.0"},"gitHead":"c3a63a52e032ac385149a919141307ff50680ad1","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"npm run build","lint:fix":"eslint src --fix","test:watch":"jest --watch","format:check":"prettier --check \"src/**/*.ts\"","release:check":"npm run clean && npm run lint && npm run format:check && npm test -- --runInBand && npm run build && npm pack --dry-run --json","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"kamil-aexol","email":"kamil@aexol.com"},"repository":{"url":"https://gitlab.aexol.com/aexol/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.9.8","description":"Basecamp MCP server, CLI, and typed TypeScript SDK for LLM-friendly project data","directories":{},"_nodeVersion":"22.23.2","dependencies":{"zod":"^3.25.67","chalk":"^5.6.2","commander":"^14.0.3","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","jest":"^30.4.2","eslint":"^9.39.4","rimraf":"^6.1.3","ts-jest":"^29.4.11","prettier":"^3.8.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.9.2","typescript-eslint":"^8.61.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","@typescript-eslint/eslint-plugin":"^8.61.0"},"_npmOperationalInternal":{"tmp":"tmp/basecamp-to-llm_2.0.4_1788263392780_0.5146680492956852","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"_id":"@aexol-studio/basecamp-to-llm@2.0.5","bin":{"basecamp-mcp":"dist/mcp-server.js","basecamp-to-llm":"dist/cli.js"},"bugs":{"url":"https://gitlab.aexol.com/aexol/basecamp-to-llm/-/issues"},"dist":{"shasum":"b164d6801a70788defe4644a7ff2355cfade1f0e","tarball":"https://registry.npmjs.org/@aexol-studio/basecamp-to-llm/-/basecamp-to-llm-2.0.5.tgz","fileCount":75,"integrity":"sha512-zpY3DT/uot8SbPX0n2yzEtE87xXs7tLv3zcyQV9BJh8Gb4vl7FV0yphYOutX6tcIrfbPrE/aRzNZn5xA1cJu5A==","signatures":[{"sig":"MEUCIFvTwAvZjuY3rt4dHnQeKGnrFMieJJ6oBXZume3DQGQCAiEAxVTX1ZhWV9leAKFR4oHfB2VwGluOAAODMVu0HJiJJ9E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDeyOAABwJLuVv9LBn5wCgKqqMPeK3OREmMJ0Vdi2o9igIgGtpfkyqFD9VMHbOyeXKOTrR9p7+Yoi7N2DxO0j+Wtkw="}],"unpackedSize":249019},"main":"dist/index.js","name":"@aexol-studio/basecamp-to-llm","type":"module","types":"dist/index.d.ts","author":{"name":"Aexol Studio"},"engines":{"node":">=20.0.0"},"gitHead":"7de51b91f6fb430f7d1fd4a632b79877372cb03a","license":"MIT","scripts":{"dev":"tsc --watch","lint":"eslint src","test":"jest","build":"tsc","clean":"rimraf dist","format":"prettier --write \"src/**/*.ts\"","prepare":"npm run build","lint:fix":"eslint src --fix","test:watch":"jest --watch","format:check":"prettier --check \"src/**/*.ts\"","release:check":"npm run clean && npm run lint && npm run format:check && npm test -- --runInBand && npm run build && npm pack --dry-run --json","prepublishOnly":"npm run clean && npm run build"},"version":"2.0.5","_npmUser":{"name":"kamil-aexol","email":"kamil@aexol.com"},"homepage":"https://gitlab.aexol.com/aexol/basecamp-to-llm","keywords":["basecamp","mcp","model-context-protocol","cli","sdk","todos","tasks","llm","codex","project-management"],"repository":{"url":"https://gitlab.aexol.com/aexol/basecamp-to-llm.git","type":"git"},"_npmVersion":"10.9.9","description":"Basecamp MCP server, CLI, and typed TypeScript SDK for LLM-friendly project data","directories":{},"maintainers":[{"name":"aexol-office","email":"office@aexol.com"},{"name":"kamil-aexol","email":"kamil@aexol.com"}],"_nodeVersion":"22.23.3","dependencies":{"zod":"^3.25.67","chalk":"^5.6.2","commander":"^14.0.3","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4.22.4","jest":"^30.4.2","eslint":"^9.39.4","rimraf":"^6.1.3","ts-jest":"^29.4.11","prettier":"^3.8.4","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.9.2","typescript-eslint":"^8.61.0","eslint-config-prettier":"^10.1.8","eslint-plugin-prettier":"^5.5.6","@typescript-eslint/parser":"^8.61.0","@typescript-eslint/eslint-plugin":"^8.61.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/basecamp-to-llm_2.0.5_1790575842350_0.9713750697802637"}}},"time":{"created":"2025-08-30T12:26:07.484Z","modified":"2026-09-28T06:10:42.592Z","1.0.0":"2025-08-30T12:26:07.911Z","1.1.0":"2025-08-30T14:22:54.158Z","1.1.1":"2025-08-30T14:59:06.718Z","1.1.2":"2025-08-30T15:31:40.077Z","1.2.0":"2025-11-19T14:30:14.222Z","1.3.1":"2026-01-19T10:46:13.005Z","1.3.2":"2026-02-13T17:11:19.225Z","1.4.0":"2026-06-09T13:17:09.119Z","1.4.1":"2026-06-09T14:17:22.625Z","2.0.4":"2026-09-01T11:49:52.902Z","2.0.5":"2026-09-28T06:10:42.433Z"},"bugs":{"url":"https://gitlab.aexol.com/aexol/basecamp-to-llm/-/issues"},"author":{"name":"Aexol Studio"},"license":"MIT","homepage":"https://gitlab.aexol.com/aexol/basecamp-to-llm","keywords":["basecamp","mcp","model-context-protocol","cli","sdk","todos","tasks","llm","codex","project-management"],"repository":{"url":"https://gitlab.aexol.com/aexol/basecamp-to-llm.git","type":"git"},"description":"Basecamp MCP server, CLI, and typed TypeScript SDK for LLM-friendly project data","maintainers":[{"name":"aexol-office","email":"office@aexol.com"},{"name":"kamil-aexol","email":"kamil@aexol.com"}],"readme":"# @aexol-studio/basecamp-to-llm\n\nBasecamp MCP server and CLI for AI-assisted project management. Connect your IDE (Codex, Cursor, OpenCode) to Basecamp via the Model Context Protocol.\n\nRequires Node.js 20 or newer. CI tests the Node.js 20 and 22 LTS lines; newer compatible Node.js releases are not intentionally excluded.\n\n## Features\n\n- **MCP Server** — 14 tools for managing Basecamp projects, cards, steps, comments, and attachments directly from your IDE\n- **CLI** — Authenticate, list projects, call any Basecamp API endpoint, and run SDK actions from the terminal\n- **Typed SDK** — Modular TypeScript SDK covering projects, card tables, people, comments, steps, messages, and todos\n- **OAuth2 Authentication** — Secure token-based auth with automatic refresh\n- **Enriched Cards** — Fetch cards with full comment history, visual attachments (images), and formatted text output for LLM context\n- **Kanban Management** — Create tasks with checklists, move cards between columns, update assignees and due dates\n\n## Quick Start\n\n### 1. Create a Basecamp OAuth App\n\n1. Go to [https://launchpad.37signals.com/integrations](https://launchpad.37signals.com/integrations)\n2. Create a new integration\n3. Set the redirect URI to `http://localhost:8787/callback`\n4. Note your `client_id` and `client_secret`\n\n### 2. Environment Variables\n\n```bash\nexport BASECAMP_CLIENT_ID=\"your_client_id\"\nexport BASECAMP_CLIENT_SECRET=\"your_client_secret\"\nexport BASECAMP_REDIRECT_URI=\"http://localhost:8787/callback\"\nexport BASECAMP_USER_AGENT=\"Your App Name (your@email.com)\"\n# Optional when your authorization includes multiple Basecamp accounts\nexport BASECAMP_ACCOUNT_ID=\"your_account_id\"\n```\n\nThese are shell exports: run them in the same shell (or shell startup file) that launches the CLI. The package does not load `.env` files automatically. MCP clients may instead set the variables in their server configuration.\n\n### 3. Install\n\n```bash\nnpm install @aexol-studio/basecamp-to-llm\n```\n\n### 4. Authenticate\n\n```bash\nnpx @aexol-studio/basecamp-to-llm auth --open\n```\n\n### Token cache security\n\nOAuth tokens are cached in `.basecamp/basecamp-token.json` under the current working\ndirectory. Treat this file as sensitive and do not commit it. If your setup has an older\nor root-level token cache such as `.basecamp-token`, ignore that too:\n\n```gitignore\n# Basecamp OAuth token cache\n.basecamp/\n.basecamp-token*\n```\n\n## MCP Server Setup\n\nInstall as a dev dependency in your project:\n\n```bash\nnpm install --save-dev @aexol-studio/basecamp-to-llm\n```\n\nThe package installs two binaries:\n\n- `basecamp-to-llm` provides the CLI, including the `mcp` subcommand.\n- `basecamp-mcp` starts the MCP stdio server directly.\n\nThen configure your IDE:\n\n<details>\n<summary><strong>Codex</strong></summary>\n\nCreate `.codex/config.toml`:\n\n```toml\n[mcp_servers.basecamp]\ncommand = \"npx\"\nargs = [\"-y\", \"@aexol-studio/basecamp-to-llm\", \"mcp\"]\nenv_vars = [\"BASECAMP_CLIENT_ID\", \"BASECAMP_CLIENT_SECRET\", \"BASECAMP_REDIRECT_URI\", \"BASECAMP_USER_AGENT\"]\n```\n\n</details>\n\n<details>\n<summary><strong>Cursor</strong></summary>\n\nCreate `.cursor/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"basecamp\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@aexol-studio/basecamp-to-llm\", \"mcp\"],\n      \"env\": {\n        \"BASECAMP_CLIENT_ID\": \"${env:BASECAMP_CLIENT_ID}\",\n        \"BASECAMP_CLIENT_SECRET\": \"${env:BASECAMP_CLIENT_SECRET}\",\n        \"BASECAMP_REDIRECT_URI\": \"${env:BASECAMP_REDIRECT_URI}\",\n        \"BASECAMP_USER_AGENT\": \"${env:BASECAMP_USER_AGENT}\"\n      }\n    }\n  }\n}\n```\n\n</details>\n\n<details>\n<summary><strong>OpenCode</strong></summary>\n\nAdd to `opencode.jsonc` under the top-level `mcp` key:\n\n```jsonc\n{\n  \"mcp\": {\n    \"basecamp\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"@aexol-studio/basecamp-to-llm\", \"mcp\"],\n      \"environment\": {\n        \"BASECAMP_CLIENT_ID\": \"{env:BASECAMP_CLIENT_ID}\",\n        \"BASECAMP_CLIENT_SECRET\": \"{env:BASECAMP_CLIENT_SECRET}\",\n        \"BASECAMP_REDIRECT_URI\": \"{env:BASECAMP_REDIRECT_URI}\",\n        \"BASECAMP_USER_AGENT\": \"{env:BASECAMP_USER_AGENT}\",\n      },\n    },\n  },\n}\n```\n\n</details>\n\n<details>\n<summary><strong>Claude Code / Other MCP Clients</strong></summary>\n\nUse stdio transport with the command:\n\n```bash\nnpx -y @aexol-studio/basecamp-to-llm mcp\n```\n\nSet the four required environment variables (`BASECAMP_CLIENT_ID`, `BASECAMP_CLIENT_SECRET`, `BASECAMP_REDIRECT_URI`, `BASECAMP_USER_AGENT`) in your client's MCP config. `BASECAMP_ACCOUNT_ID` is optional.\n\n</details>\n\nThe MCP server first connects over stdio, then tries a cached token or silent refresh. If neither is available, it opens a browser and waits for the configured local OAuth callback. In a headless environment, authenticate first with `basecamp-to-llm auth` (copy the printed URL into a browser) or provide a reusable token cache; a failed automatic browser flow is logged to stderr and does not terminate the MCP server. All MCP logs use stderr so stdout remains reserved for the protocol.\n\n### Available MCP Tools\n\nRequired arguments are shown without `?`; optional arguments include `?`.\n\n| Tool                           | Arguments                                                                                    | Description                                                      |\n| ------------------------------ | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------- |\n| `authenticate`                 | `openBrowser?`                                                                               | Start or refresh OAuth authentication                            |\n| `api_request`                  | `method`, `path`, `query?`, `body?`, `absolute?`                                             | Make a generic Basecamp API request                              |\n| `sdk_projects_list`            | `status?`, `page?`                                                                           | List projects; `status` may be `archived` or `trashed`           |\n| `sdk_card_tables_get`          | `projectId`, `tableId`                                                                       | Get a raw board and its column metadata; use `list_cards` for cards |\n| `sdk_card_tables_list_cards`   | `projectId`, `columnId`, `detail?`, `page?`, `limit?`                                        | List a bounded page of compact or extended cards                 |\n| `sdk_card_tables_get_card`     | `projectId`, `cardId`                                                                        | Get one raw card                                                 |\n| `sdk_card_tables_get_enriched` | `projectId`, `cardId`, `format?`, `downloadImages?`, `imageQuality?`                         | Get card context with comments, creator data, and attachments    |\n| `sdk_card_tables_create_task`  | `projectId`, `columnId`, `title`, `content`, `due_on?`, `assignee_ids?`, `notify?`, `steps?` | Create a card and optional checklist steps                       |\n| `sdk_card_tables_update_card`  | `projectId`, `cardId`, `title?`, `content?`, `due_on?`, `assignee_ids?`                      | Update supported card fields                                     |\n| `sdk_card_tables_move_card`    | `projectId`, `cardId`, `columnId`                                                            | Move a card to another column                                    |\n| `sdk_people_list`              | None                                                                                         | List people in the account                                       |\n| `sdk_comments_create`          | `projectId`, `recordingId`, `content`                                                        | Add an HTML comment to a recording                               |\n| `sdk_steps_complete`           | `projectId`, `stepId`, `completion`                                                          | Set step completion to `on` or `off`                             |\n| `sdk_attachments_download`     | `url`, `filename?`, `mimeType?`                                                              | Download and save an attachment; return image content or file metadata |\n\n### Compact card listing and pagination\n\n`sdk_card_tables_list_cards` defaults to `detail: \"compact\"`, `page: 1`, and\n`limit: 25`. `page` is one-based and `limit` must be from 1 through 100. Compact\ncards contain only:\n\n- `id`, normalized `title` (`title`, then `name`, then an empty string)\n- optional `status`, `position`, `due_on`, `app_url`, and `updated_at`\n- projected `assignees` with `id` and `name` only\n- normalized `comments_count`\n- `steps` counts with `completed` and `total`\n\nCompact cards do not include card descriptions, content, or comment bodies. Use\n`detail: \"extended\"` when the full raw Basecamp `Card` objects are required for\nthe requested window. Listing cards never fetches comment bodies; use\n`sdk_card_tables_get_enriched` when comment context is explicitly needed.\n\nCompact request arguments:\n\n```json\n{\n  \"projectId\": 123,\n  \"columnId\": 456,\n  \"page\": 1,\n  \"limit\": 25\n}\n```\n\nExtended request arguments:\n\n```json\n{\n  \"projectId\": 123,\n  \"columnId\": 456,\n  \"detail\": \"extended\",\n  \"page\": 2,\n  \"limit\": 10\n}\n```\n\nBoth modes return the same envelope:\n\n```json\n{\n  \"detail\": \"compact\",\n  \"cards\": [],\n  \"pagination\": {\n    \"page\": 1,\n    \"limit\": 25,\n    \"returned\": 0,\n    \"has_more\": false\n  }\n}\n```\n\nWhen `has_more` is true, `pagination.next_page` contains the next one-based page.\nIt is omitted otherwise. The response does not report a total because the\nbounded traversal does not fetch the complete collection.\n\n### Enriched card text and attachment downloads\n\n`sdk_card_tables_get_enriched` with `format: \"text\"` preserves the card description as Basecamp HTML. Comment bodies are converted to plain text. This deliberate distinction keeps rich description markup and embedded attachment references available to the LLM.\n\nWith `downloadImages: true`, `sdk_card_tables_get_enriched` returns one text metadata block plus a separate MCP image block for each successfully downloaded image. Base64 is removed from the text block, and query strings/fragments are removed from Basecamp URLs in projected text so signed capabilities are not duplicated into LLM context. Automatic downloads are limited to the first four images with at most two active downloads; metadata remains available for additional images. Individual image failures remain best-effort and are logged to MCP stderr. The `imageQuality` option applies only to these enriched-card image downloads.\n\n`sdk_attachments_download` always writes the downloaded bytes to `.basecamp/images/` under the process's current working directory. If `filename` is omitted, it uses `attachment`; characters other than letters, numbers, `.`, `_`, and `-` become `_`, while `.` and `..` are rejected. The download directory and destination must not be symlinks. Files are opened without symlink following, verified as regular files, and written with mode `0600` where supported. A download overwrites an existing regular file with the same sanitized name. The response `Content-Type` is authoritative; caller `mimeType` is only a fallback for non-image data. MCP image output requires PNG, JPEG, GIF, or WebP magic bytes plus safe response metadata, preventing HTML or unknown bytes mislabeled by a caller from becoming image blocks.\n\nBinary downloads accept only HTTPS URLs without embedded credentials on the exact supported Basecamp API, preview, and storage hosts. Redirects are followed manually with a bounded limit, and every target is validated. OAuth authorization is sent only to `3.basecampapi.com` and is never forwarded to preview or storage hosts. Each binary is limited to 10 MiB: oversized `Content-Length` values are rejected before reading, streamed chunk overflow is canceled, and non-streaming runtimes receive the same post-read cap.\n\n## CLI Usage\n\n```bash\n# Authenticate with Basecamp (opens browser)\nbasecamp-to-llm auth --open\n\n# List available projects\nbasecamp-to-llm projects\n\n# Start the MCP server\nbasecamp-to-llm mcp\n\n# Or start the installed MCP binary directly\nbasecamp-mcp\n\n# Call any Basecamp API endpoint\nbasecamp-to-llm api GET /projects.json\nbasecamp-to-llm api POST /todosets/123/todolists.json -d '{\"name\":\"My List\"}'\n\n# List available SDK actions\nbasecamp-to-llm sdk list\n\n# Run an SDK action\nbasecamp-to-llm sdk run projects.list\nbasecamp-to-llm sdk run card_tables.get -a '{\"projectId\":123,\"tableId\":456}'\nbasecamp-to-llm sdk run card_tables.list_cards -a '{\"projectId\":123,\"columnId\":456,\"page\":1,\"limit\":25}'\n```\n\n## Programmatic Usage\n\n```typescript\nimport { BasecampClient, SDK } from \"@aexol-studio/basecamp-to-llm\";\n\nconst client = new BasecampClient();\n\n// List projects\nconst projects = new SDK.ProjectsResource(client);\nconst list = await projects.list();\n\n// List a bounded compact page\nconst cards = new SDK.CardTablesResource(client);\nconst page = await cards.listCardsPage(projectId, columnId, {\n  detail: \"compact\",\n  page: 1,\n  limit: 25,\n});\n\n// Create a task with steps\nconst task = await cards.createCardWithSteps(projectId, columnId, {\n  title: \"Implement auth\",\n  content: \"<p>OAuth2 support</p>\",\n  steps: [\n    { title: \"Design auth flow\" },\n    { title: \"Implement OAuth2\" },\n    { title: \"Write tests\" },\n  ],\n});\n```\n\nFor `createCardWithSteps`, each nested step requires `title`; optional `due_on` uses `YYYY-MM-DD`, and optional `assignees` is a comma-separated string of Basecamp person IDs. The card-level field remains `assignee_ids: number[]`.\n\nThe enriched-card aggregation and text formatter are currently MCP-facing helpers rather than stable top-level programmatic exports. The existing public API (`BasecampFetcher`, `BasecampAuth`, `BasecampClient`, and the `SDK` resource namespace) remains available; use `SDK.CardTablesResource` for the stable typed card API.\n\n## Development\n\n### Prerequisites\n\n- Node.js 20 or newer (CI tests the Node.js 20 and 22 LTS lines)\n- npm\n\n### Setup\n\n```bash\ngit clone git@gitlab.aexol.com:aexol/basecamp-to-llm.git\ncd basecamp-to-llm\nnpm install\n```\n\n### Scripts\n\n```bash\nnpm run build          # Compile TypeScript\nnpm run dev            # Watch mode\nnpm test               # Run tests\nnpm run test:watch     # Watch tests\nnpm run lint           # ESLint check\nnpm run lint:fix       # ESLint autofix\nnpm run format         # Format TypeScript with Prettier\nnpm run format:check   # Check TypeScript formatting\nnpm run clean          # Remove dist/\n```\n\n### Project Structure\n\n```\nsrc/\n├── cli.ts                # CLI entry point\n├── index.ts              # Public exports\n├── auth.ts               # OAuth2 authentication\n├── basecamp-fetcher.ts   # Legacy high-level fetcher\n├── basecamp-types.ts     # TypeScript type definitions\n├── mcp-server.ts         # MCP server implementation\n└── sdk/\n    ├── index.ts           # SDK exports\n    ├── client.ts          # BasecampClient\n    ├── registry.ts        # Tool registry for MCP\n    ├── types.ts           # SDK type definitions\n    └── resources/\n        ├── cardTables.ts  # Kanban boards and cards\n        ├── comments.ts    # Comments\n        ├── enrichedCards.ts # Enriched card context\n        ├── messages.ts    # Messages\n        ├── people.ts      # People\n        ├── projects.ts    # Projects\n        ├── steps.ts       # Card checklist steps\n        └── todos.ts       # Todos\n```\n\n## License\n\nMIT — see [LICENSE](LICENSE) for details.\n\nContributions welcome — [open an issue](https://gitlab.aexol.com/aexol/basecamp-to-llm/-/issues) or submit a merge request.\n","readmeFilename":"README.md"}