{"_id":"@codearchitects/mcp-scanner","_rev":"11-4f75b8d60b19bf25c386f8c92107b83e","name":"@codearchitects/mcp-scanner","dist-tags":{"latest":"1.2.2"},"versions":{"1.0.0":{"name":"@codearchitects/mcp-scanner","version":"1.0.0","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.0.0","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"5c13868fcd0afb32cabc9d05186c6ce8a29fa2c4","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.0.0.tgz","fileCount":43,"integrity":"sha512-Y3HOa+B1j5xAHoerWL+WHlURt5mxQzr3R7oJ3jCkGuQWdFBKi96/2Bd1Jwz5oHsL35K42sfbZZLsMSqFIoA45w==","signatures":[{"sig":"MEUCIQDJMJvsUrhXHWImd3vqC78opVu3nywmqyuau3JyV5wavwIgH6D3QZaQSq8CVGzN2/SB0GwW2dDspIflRX7BRqP7Uxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":97247},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"891490cc6ac4680639bf7021ec1832fa49561aa8","scripts":{"build":"tsc","clean":"rm -rf dist","watch":"tsc --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.0.0_1776788553785_0.026132692471465324","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@codearchitects/mcp-scanner","version":"1.0.3","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.0.3","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"58ea65c0509964e062acc741954ee0963bb036ab","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.0.3.tgz","fileCount":43,"integrity":"sha512-o2jfXBACt0wjTT7p4Lf4ULMy6RNb6bNU3MDMhCKhzSMGv2pFxkFFGXcAJ9FAa5sIvg7qIzuhIGj6nOchS6K/1A==","signatures":[{"sig":"MEQCIBLW61cXEGzHxEieEF6Db4HmUBiQkKZrzxBPmWoaC8WXAiA4PnAhXr6CRQm7tt2HJDu1DPEzvnrh5QJWqJ4slRfd0g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":97349},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"90493a748634d36082b58995e6bda7547422bca9","scripts":{"build":"tsc","clean":"rm -rf dist","watch":"tsc --watch","prepublishOnly":"npm run build"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.0.3_1776790622043_0.08399654080226493","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@codearchitects/mcp-scanner","version":"1.1.0","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.1.0","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"ffcb82f182067ac5ed3da577b010b2b6c8538098","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.1.0.tgz","fileCount":52,"integrity":"sha512-Bqn4aelEasNBU6lIVYfKlEWuKLukrIVEA2odnryQY2zOmQoBtOmQnAgfT9qJn1xi5ugeiUz1YH6ILqS6IG499Q==","signatures":[{"sig":"MEQCICn0hBr+uotYkcc6M7v63/9b6U5zJN2WbkYBX1viHiF1AiAabbb1xp3Ok9bVQAz2b1IF1N2tyNI+BfHmG/v3CUpdDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":178478},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"6412fd821646f3d7abd2b5fd56e6abd460ff6ab0","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.1.0_1777457951323_0.21376462964460297","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@codearchitects/mcp-scanner","version":"1.1.1","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.1.1","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"dde4a83c83db9de698363d5872597e1ccb7d4de5","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.1.1.tgz","fileCount":56,"integrity":"sha512-tY3AxPS0WT2msUBqrewDVZxiEHM2w0Iy7xPmTERqnT01rFNEnwg18UeTGCo1MPly1S9gvkH/PdkhTYfRgCHBZg==","signatures":[{"sig":"MEYCIQCrQ6/gzge7STpCnSZ8h5PxQQMH02Nj3mewCw/4WxO7mQIhAOA4RXXNWCo3nw7k3yNPBE2LYSAC+t7IichwAERRLIoD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":199013},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"7fe937d8f5669d64ef26f8d4e73a2925ee3b8687","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.1.1_1777475430001_0.9993804118775038","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@codearchitects/mcp-scanner","version":"1.1.2","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.1.2","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"c16a02320a608b51567eb691df38c21068e98a4b","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.1.2.tgz","fileCount":56,"integrity":"sha512-edMBCTlAtv+KO1QI7THkxWYI5VRJg+H4z+aljWRq+Ewo0LwH70Hp2Vhd9oRv7wDqLjx53rfzD98GLwoD2AXfHw==","signatures":[{"sig":"MEUCIDcWnZww19+0AW/z3JO9Gse3w6vrll7q6ets2QNhn22OAiEAk1yJCm3ekThO25OikO7zUAy40vzrNUA7b8GLBo0K1qA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":203270},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"6ad10de23412dc72046b3a7065196f570648fdea","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.1.2_1777477830225_0.40910944288345097","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@codearchitects/mcp-scanner","version":"1.1.3","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.1.3","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"f9038e46f951e5d608f5660c961f4b384c6a4288","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.1.3.tgz","fileCount":56,"integrity":"sha512-s3dPVoQRRbDM2OAcEhJ04aYvzLbUMea/+x3l7gtYiWfo2fAAw/ZxuV+uYOc2uFR6nsrwEt2qHVy1N1FoYQ5juQ==","signatures":[{"sig":"MEUCIQDLW7hdFVlYu+x7xkMQUEhvzXa1xEhXW2IvFVF2tKs8PgIgWXH3SVP3scGKPRRUZn/aARD5LVOjR5eg0P9e901TxJI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":215167},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"fcb2bcf47ceb164b94fdea3a674ea3278ea3ee8e","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.1.3_1777480404677_0.8773535706129556","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@codearchitects/mcp-scanner","version":"1.1.4","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.1.4","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"7202d462fe4aa50a3b9115d677364a7077ab610c","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.1.4.tgz","fileCount":56,"integrity":"sha512-L8YcOCxkYArcZ4tdYrrw0fBgHC6qorM94sD/e30OGjNIqln1OGCizc7FX88t/4nrDwmSp3kpFVo1ll0/1VzdoQ==","signatures":[{"sig":"MEUCIHx8lCn+UzIInt3oNH9AuQfZzp2wVhAPpDQoVotg5wSFAiEA6e7WuzxqG4IVVc/cME1uUFLZhf/a6MPPPTQ8NzHE+Mc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":220657},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"82d140388d2b8f0e55ff424e708e5c44d9d17069","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.1.4_1777536954300_0.5689978171633958","host":"s3://npm-registry-packages-npm-production"}},"1.1.5":{"name":"@codearchitects/mcp-scanner","version":"1.1.5","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.1.5","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"da17aebc6d999402d9303d00d499c933e4fdc0bf","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.1.5.tgz","fileCount":56,"integrity":"sha512-Kt42nqP+dyGrtFQ5nFvgrBpotKLW2LJyw07JKJitY9bsVRPzLMQc+6uNOFOPQgofGVFwHJN1/SJUoBmBYY882Q==","signatures":[{"sig":"MEUCIEMCyOkDh8kQIOAE1MVZkCMCK/OxVuzIuwJcjLOxYCbZAiEAm9p4hcZZrfM+1WB7n6chQvLlz6RfWA1RM7739jOBWeY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":220738},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"bcba3422f2759c1255e7e227f6a06047fd0ba4c0","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.1.5_1779276336834_0.5080152683125756","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@codearchitects/mcp-scanner","version":"1.2.0","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.2.0","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"1b5eb487cf81db30cd3d6c9d8b88d538087a9bc2","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.2.0.tgz","fileCount":60,"integrity":"sha512-BSWb2r+4BZZYwemoFuQUg1KSVzqsoJJxvCGzI0D3IWH82mOUDpWqmM/clQ2PxRMz/CZvxSlRMhUdylzZJlQBow==","signatures":[{"sig":"MEQCIDGOFXgHRN0Ww7L8YEAGtJyQTbD6gGRh+U5HnkRMyKdaAiB75jlbVp5T4xYnT5vm/9xkf21aXqiSNjwws6TIzgB7JQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263694},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"41323980ceae9a7b07630a2aa7313d51017ab962","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.2.0_1783422305223_0.7438539098850545","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"@codearchitects/mcp-scanner","version":"1.2.1","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","_id":"@codearchitects/mcp-scanner@1.2.1","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"homepage":"https://github.com/codearchitects/mcp-scanner#readme","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"bin":{"mcp-scanner":"dist/cli.js"},"dist":{"shasum":"ddbe92c17d1acfe4bf1e754e5a15db2a6db3a7d0","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.2.1.tgz","fileCount":60,"integrity":"sha512-X4nBd5IRHkvjfUvdX99iHYI0kBvn3Q2SZDU1adJPIpe1krUCAx1JB5wws/ll65MB6ginGVZ1zqunIcQuymrGZg==","signatures":[{"sig":"MEUCIFoYkVZsXlPjjYvGERFpaFUThPvNMkLDh0hlncq2RlotAiEAkEpY6LvuVuJJb8ItHrDe6p6nEzjds83iraIW9xEDQWQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":264591},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"gitHead":"1e00cdea8b2d93f04d248ce7b86738bb7389a8d0","scripts":{"test":"vitest run","build":"tsc && npm run copy-templates","clean":"rm -rf dist","watch":"tsc --watch","test:ci":"npm run test:coverage","test:unit":"vitest run tests/unit","test:coverage":"vitest run --coverage","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","prepublishOnly":"npm run build","test:integration":"vitest run tests/integration"},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"repository":{"url":"git+https://github.com/codearchitects/mcp-scanner.git","type":"git"},"_npmVersion":"10.8.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","directories":{},"_nodeVersion":"20.20.2","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.1.5","@types/ejs":"^3.1.5","typescript":"^5.7.3","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/mcp-scanner_1.2.1_1783429726605_0.4297857046018516","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@codearchitects/mcp-scanner","version":"1.2.2","description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","repository":{"type":"git","url":"git+https://github.com/codearchitects/mcp-scanner.git"},"main":"dist/index.js","types":"dist/index.d.ts","bin":{"mcp-scanner":"dist/cli.js"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./vscode":{"types":"./dist/vscode/index.d.ts","default":"./dist/vscode/index.js"}},"typesVersions":{"*":{"vscode":["dist/vscode/index.d.ts"]}},"scripts":{"build":"tsc && npm run copy-templates","copy-templates":"node -e \"const fs = require('fs'); const path = require('path'); fs.mkdirSync('dist/templates', { recursive: true }); fs.copyFileSync('src/templates/proxy-scaffold.ejs', 'dist/templates/proxy-scaffold.ejs');\"","watch":"tsc --watch","test":"vitest run","test:unit":"vitest run tests/unit","test:integration":"vitest run tests/integration","test:coverage":"vitest run --coverage","test:ci":"npm run test:coverage","prepublishOnly":"npm run build","clean":"rm -rf dist"},"keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"author":{"name":"Code Architects"},"license":"MIT","dependencies":{"ejs":"^3.1.10","reflect-metadata":"^0.2.2"},"peerDependencies":{"typescript":">=5.0.0"},"peerDependenciesMeta":{"typescript":{"optional":false}},"devDependencies":{"@types/ejs":"^3.1.5","@types/node":"^20.11.0","@types/vscode":"^1.96.0","@vitest/coverage-v8":"^4.1.5","typescript":"^5.7.3","vitest":"^4.1.5"},"engines":{"node":">=18.0.0"},"_id":"@codearchitects/mcp-scanner@1.2.2","gitHead":"b010495ab3484c33a531c40a5ff182df6563e031","bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"homepage":"https://github.com/codearchitects/mcp-scanner#readme","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-JDqd7mRX89Kr0o/zKmseRNqn1BoKJzFYb1sHPV0wTOijsGtjXmLtyQfloBz39NA25ry5UrAt9T3O8s8CP/VNkA==","shasum":"9c04026458a42a1966feaf0debf9e68d86028640","tarball":"https://registry.npmjs.org/@codearchitects/mcp-scanner/-/mcp-scanner-1.2.2.tgz","fileCount":60,"unpackedSize":266532,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@codearchitects%2fmcp-scanner@1.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEb1mK7WrQseeNeTi7ezMlZGHHbXw+CBRVHfb6uKCNpQAiAw7AhaT8S0sIiWiCxFk1GzeP3txK0tFmP7l0w/bQxeLw=="}]},"_npmUser":{"name":"gmasci","email":"gmasci@codearchitects.com"},"directories":{},"maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-scanner_1.2.2_1783514045618_0.8832568188258245"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-21T16:22:33.680Z","modified":"2026-07-08T12:34:06.244Z","1.0.0":"2026-04-21T16:22:33.918Z","1.0.3":"2026-04-21T16:57:02.195Z","1.1.0":"2026-04-29T10:19:11.469Z","1.1.1":"2026-04-29T15:10:30.191Z","1.1.2":"2026-04-29T15:50:30.354Z","1.1.3":"2026-04-29T16:33:24.827Z","1.1.4":"2026-04-30T08:15:54.447Z","1.1.5":"2026-05-20T11:25:37.062Z","1.2.0":"2026-07-07T11:05:05.388Z","1.2.1":"2026-07-07T13:08:46.805Z","1.2.2":"2026-07-08T12:34:05.779Z"},"bugs":{"url":"https://github.com/codearchitects/mcp-scanner/issues"},"author":{"name":"Code Architects"},"license":"MIT","homepage":"https://github.com/codearchitects/mcp-scanner#readme","keywords":["mcp","vscode","language-model-tool","typescript","scanner","decorator","copilot"],"repository":{"type":"git","url":"git+https://github.com/codearchitects/mcp-scanner.git"},"description":"Scan TypeScript projects for @ExposeTool decorated methods and generate VS Code languageModelTools entries in package.json","maintainers":[{"name":"gdimauro","email":"gdimauro@codearchitects.com"},{"name":"gmasci","email":"gmasci@codearchitects.com"},{"name":"mdanzica","email":"mdanzi@codearchitects.com"}],"readme":"# @codearchitects/mcp-scanner\n\nScan TypeScript projects for `@ExposeTool` decorated methods and automatically generate VS Code `contributes.languageModelTools` entries in `package.json`.\n\n## Installation\n\n```bash\n# Global (provides `mcp-scanner` CLI)\nnpm install -g @codearchitects/mcp-scanner\n\n# As a project dependency\nnpm install @codearchitects/mcp-scanner\n```\n\n## Quick Start\n\n### 1. Decorate your methods\n\n```typescript\nimport { ExposeTool } from '@codearchitects/mcp-scanner';\n\ninterface IGreetParams {\n  /** The user's name. */\n  name: string;\n  /** Optional greeting style. */\n  style?: 'formal' | 'casual';\n}\n\nclass MyService {\n  @ExposeTool({\n    name: 'greetUser',\n    displayName: 'Greet User',\n    modelDescription: 'Say hello to a user by name with a chosen style.',\n    icon: '$(smiley)',\n  })\n  greetUser(params: IGreetParams): string {\n    return params.style === 'formal'\n      ? `Good day, ${params.name}.`\n      : `Hey ${params.name}!`;\n  }\n}\n```\n\n### 2. Run the scanner\n\n```bash\n# From your project root\nmcp-scanner\n\n# Or with options\nmcp-scanner --project /path/to/project --tsconfig tsconfig.json\n\n# Restrict scan only to a folder/subtree\nmcp-scanner --project /path/to/project --tools-path src/tools\n\n# Exclude one or more folders/subtrees from scan\nmcp-scanner --project /path/to/project --exclude-path src/generated --exclude-path src/legacy\n\n# Tag-scoped patching: only tools with this tag are replaced on rerun\nmcp-scanner --project /path/to/project --tools-tag core\n\n# Write to a specific package.json\nmcp-scanner --project /path/to/project --package-json ../apps/vscode-ext/package.json\n\n# Generate proxy methods into another library file\nmcp-scanner --project /path/to/source-lib \\\n  --proxy-file ../apps/vscode-ext/src/services/generated-proxies.ts \\\n  --scaffold-template ../apps/vscode-ext/proxy-scaffold.ejs \\\n  --proxy-class ModelerToolsProxy\n\n# Copy the default proxy scaffold template to customize it\nmcp-scanner --init-proxy-file ./proxy-scaffold.ejs\n\n# Dry run (preview without writing)\nmcp-scanner --dry-run\n```\n\n### 3. Result in `package.json`\n\n```json\n{\n  \"contributes\": {\n    \"languageModelTools\": [\n      { \"name\": \"existingManualTool\", \"...\" : \"...\" },\n      {\n        \"name\": \"greetUser\",\n        \"displayName\": \"Greet User\",\n        \"modelDescription\": \"Say hello to a user by name with a chosen style.\",\n        \"canBeReferencedInPrompt\": true,\n        \"toolReferenceName\": \"greetUser\",\n        \"icon\": \"$(smiley)\",\n        \"inputSchema\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"name\": { \"type\": \"string\", \"description\": \"The user's name.\" },\n            \"style\": { \"type\": \"string\", \"enum\": [\"formal\", \"casual\"], \"description\": \"Optional greeting style.\" }\n          },\n          \"required\": [\"name\"]\n        }\n      }\n    ]\n  }\n}\n```\n\n`mcp-scanner` also writes `.mcp-scanner.state.json` in the project root to track which tools were generated in the previous run.\nOn re-run, only those previously generated tools are replaced, while manually-added tools are preserved.\nIf legacy marker strings are present (`____AUTOGEN_TOOLS_START____` / `____AUTOGEN_TOOLS_END____`), they are migrated automatically on the next run.\n\n## VS Code Extension Integration\n\nIn your VS Code extension, register the Language Model Tool so users can invoke it from Copilot Chat:\n\n```typescript\nimport { registerScanProjectToolsLmTool } from '@codearchitects/mcp-scanner/vscode';\n\nexport function activate(context: vscode.ExtensionContext) {\n  // ... your extension setup ...\n\n  // Register #scanProjectTools LM tool\n  registerScanProjectToolsLmTool(context);\n}\n```\n\nThen declare it in your extension's `package.json`:\n\n```json\n{\n  \"contributes\": {\n    \"languageModelTools\": [\n      {\n        \"name\": \"scanProjectTools\",\n        \"displayName\": \"Scan Project: @ExposeTool → package.json\",\n        \"modelDescription\": \"Scan the current TypeScript project for methods decorated with @ExposeTool, generate JSON Schema from parameter interfaces, and update contributes.languageModelTools in package.json.\",\n        \"canBeReferencedInPrompt\": true,\n        \"toolReferenceName\": \"scanProjectTools\",\n        \"icon\": \"$(search)\",\n        \"inputSchema\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"tsconfigPath\": { \"type\": \"string\", \"description\": \"tsconfig file name. Defaults to tsconfig.json.\" },\n            \"autoApply\": { \"type\": \"boolean\", \"description\": \"Apply changes without confirmation.\" }\n          }\n        }\n      }\n    ]\n  }\n}\n```\n\n## API\n\n### `ExposeTool(options)` — Method Decorator\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| `name` | `string` | ✅ | Unique tool name |\n| `displayName` | `string` | ✅ | Human-readable label |\n| `modelDescription` | `string` | ✅ | Description for the language model |\n| `icon` | `string` | | VS Code codicon, e.g. `$(search)`. Default: `$(tools)` |\n| `canBeReferencedInPrompt` | `boolean` | | Allow `#tool` references. Default: `true` |\n| `transports` | `('lm' \\| 'mcp')[]` | | Where to publish the tool. `'lm'` → `package.json`; `'mcp'` → MCP manifest sidecar. Default: `['lm']` |\n| `mcpServers` | `string[]` | | Names of the MCP server groups the tool belongs to (only when `transports` includes `'mcp'`). Overrides the CLI `--tools-tag`. Omitted → the CLI `--tools-tag`, else the `default` group |\n\n### `Tool(options)` — Method Decorator\n\nUsed by code generators (e.g., proxy generation) to preserve tool metadata without exposing the method.\nAccepts the same options as `@ExposeTool` but does not register the method as a tool.\n\n`scanProject` recognises `@Tool` and derives `inputSchema` from the method parameter types exactly like `@ExposeTool` — so Library B (the proxy side) produces a fully-populated `contributes.languageModelTools` entry without any extra configuration.\n\n| Option | Type | Required | Description |\n|--------|------|----------|-------------|\n| `name` | `string` | ✅ | Unique tool name |\n| `displayName` | `string` | ✅ | Human-readable label |\n| `modelDescription` | `string` | ✅ | Description for the language model |\n| `icon` | `string` | | VS Code codicon, e.g. `$(search)`. Default: `$(tools)` |\n| `canBeReferencedInPrompt` | `boolean` | | Allow `#tool` references. Default: `true` |\n| `transports` | `('lm' \\| 'mcp')[]` | | Where to publish the tool. Default: `['lm']` |\n| `mcpServers` | `string[]` | | MCP server groups the tool belongs to. Omitted → the `default` group |\n\n### `registerExposedTools(context, instances)` — Runtime Registration\n\nRegisters methods decorated with either `@ExposeTool` or `@Tool` as VS Code Language Model Tool handlers at runtime.\nOnly tools whose `transports` includes `'lm'` are registered (tools omitting `transports` default to `['lm']`); `'mcp'`-only tools are skipped so they can be served by an MCP server instead.\nDuplicate tool names within the same activation are skipped with a warning.\nThis is useful for proxy-based architectures where generated proxy methods carry `@Tool` metadata.\n\n### `scanProject(projectRoot, tsconfigFileName?, toolsSearchPath?, excludedSearchPaths?, options?)` — Scanner\n\nReturns `IScanResult` with discovered tools, file count, and diagnostics.\nEach tool carries `transports` (always populated; defaults to `['lm']`) and optional `mcpServers`.\n`options.defaultTransport` overrides the transport applied to tools whose decorator omits it.\n\n### MCP manifest helpers\n\nFor `'mcp'`-targeting tools, mcp-scanner emits a fully-generated JSON sidecar per MCP server group:\n\n- `writeMcpManifestFile(path, tools, serverName?)` — write a manifest to disk.\n- `serializeMcpManifest(tools, serverName?)` — build the manifest JSON string.\n- `readMcpManifestFile(path)` — runtime loader for MCP servers (returns `IMcpManifest`).\n- `groupMcpToolsByServer(tools)` — group scanned tools by their MCP server group.\n\nThe manifest entries carry the native MCP `inputSchema` (JSON Schema), so an embedded MCP server can answer `tools/list` directly without reading `package.json`.\n\n### `patchPackageJsonFile(path, tools, options?)` — File Patcher\n\nPatches `package.json` on disk and updates `.mcp-scanner.state.json`.\nWhen `options.toolTag` is set, patching is tag-scoped and state-file ownership is not used.\n\n### `patchPackageJsonContent(raw, tools, previousGeneratedToolNames?, options?)` — String Patcher\n\nPatches raw JSON string (for use with VS Code fs API or other runtimes).\nAccepts an optional third argument with previously generated tool names.\n\nSignature:\n\n```ts\npatchPackageJsonContent(\n  raw: string,\n  generatedTools: IScannedTool[],\n  previousGeneratedToolNames?: string[],\n  options?: { toolTag?: string },\n): {\n  content: string;\n  result: IPatchResult;\n  nextGeneratedToolNames: string[];\n}\n```\n\n## CLI Options\n\n```\nmcp-scanner [options]\n\n--project, -p <path>    Project root (default: cwd)\n--tsconfig, -t <name>   tsconfig file name (default: tsconfig.json)\n--tools-path, -s <path>\n                      Restrict scanning to this path subtree.\n                      Can be repeated to scan multiple subtrees in one run.\n                      Relative paths are resolved from --project.\n--exclude-path, -i <path>\n                      Exclude this path subtree from scanning.\n                      Can be repeated. Relative paths are resolved from --project.\n--tools-tag, -g <tag>\n                      Tag generated tools and patch only tools with this tag.\n                      If omitted, legacy state-based patching is used.\n--package-json, -j <path>\n                      package.json path to patch.\n                      Relative paths are resolved from --project.\n                      (default: <project>/package.json)\n--mcp-manifest, -m <[name=]path>\n                      Emit an MCP manifest for tools targeting the 'mcp' transport.\n                      Use 'name=path' to bind a named MCP server group to its own\n                      file (repeatable); a bare path targets the 'default' group.\n                      Relative paths are resolved from --project.\n--default-transport <lm|mcp|both>\n                      Default transport for tools whose decorator omits\n                      'transports'. (default: lm)\n--proxy-file, -o <path>\n                      Generate proxy methods into this file.\n                      Relative paths are resolved from --project.\n--proxy-class, -c <name>\n                      Class name for generated proxies.\n                      (default: GeneratedExposeToolProxies)\n--scaffold-template, -x <path>\n                      Custom EJS scaffold template for proxy generation.\n                      Relative paths are resolved from --project.\n--init-proxy-file <path>\n                      Copy default complete proxy scaffold template.\n                      Recommended extension: .ejs\n--skip-package-json, -k Skip patching package.json. Useful when only generating\n                      proxy files or writing MCP manifests.\n--extra, -e <path> [tsconfig]\n                        Additional project root to scan (repeatable)\n--dry-run, -d           Preview without writing\n--help, -h              Show help\n```\n\n## Proxy Generation (Monorepo)\n\nWhen `@ExposeTool` methods live in one library but runtime command handlers live in another,\nyou can generate a proxy class in the target library.\n\n### Usage\n\n```bash\n# Copy the default proxy scaffold template to start with\nmcp-scanner --init-proxy-file ./proxy-scaffold.ejs\n\n# Edit proxy-scaffold.ejs to customize (class layout, method body, imports)\n# Then generate/update the TypeScript proxy file from that template\nmcp-scanner --proxy-file ./MyProxyClass.ts \\\n  --proxy-class MyCustomClassName \\\n  --scaffold-template ./proxy-scaffold.ejs\n```\n\n### What is Generated\n\n- One proxy method for each decorated source method.\n- Original method JSDoc copied to each generated proxy method.\n- Type imports required by method parameters/return type.\n- Method body includes TODO comment with context and example.\n- Reserved injection zones, so only generated sections are refreshed on re-run.\n\n### Scaffold Template Variables\n\nThe scaffold template (EJS) has access to:\n\n- `className`: The class name (set via `--proxy-class` or from template)\n- `methods`: Array of method objects with:\n  - `toolName`: Tool name from `@ExposeTool({ name })`\n  - `toolOptions`: Complete metadata object from `@ExposeTool({ displayName, modelDescription, icon, canBeReferencedInPrompt })`\n  - `methodName`: Source method name\n  - `returnTypeText`: Return type text\n  - `jsDoc`: JSDoc comment from source\n  - `parameters`: Array of `{ name, typeText, optional }`\n  - `firstParameterName`: First parameter name if present\n  - `importStatements`: Array of required import statements\n\n**Default scaffold template** (view/customize with `--init-proxy-file`):\n\n```ejs\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* This file is auto-generated by mcp-scanner. */\n\n// <mcp-scanner:proxy-imports:start>\nimport { Tool } from 'mcp-scanner';\n<%- methods.flatMap(m => m.importStatements).filter((v, i, a) => a.indexOf(v) === i).sort().join('\\n') %>\n// <mcp-scanner:proxy-imports:end>\n\n// <mcp-scanner:proxy-class:start>\nexport class <%- className %> {\n// <mcp-scanner:proxy-class:end>\n  // <mcp-scanner:proxy-methods:start>\n  // JSDoc comment\n  // @Tool decorator with metadata\n  // public async method(...) { ... }\n  // <mcp-scanner:proxy-methods:end>\n}\n```\n\nYou can also build your own template using the same EJS syntax and variable context.\n\nNotes:\n\n- Use `--package-json` and `--proxy-file` together when source and target libraries differ.\n- Use `--tools-tag` when multiple generators write to the same `languageModelTools` array.\n- On first run, if the proxy file does not exist, `mcp-scanner` creates it with markers.\n- On subsequent runs, only marker sections (imports, class, methods) are updated; manual code outside markers is preserved.\n- If the target file exists but has no method markers, generation stops to avoid destructive overwrite.\n- For local exported types declared in source files, generation uses package imports when source and target are in different packages (derived from the nearest source `package.json` name per file, including `--extra` projects), otherwise relative imports are used.\n- Local types must be `export`ed by the source package entrypoint to be importable from another package.\n\nInjection markers used by the generator:\n\n```ts\n// <mcp-scanner:proxy-imports:start>\n// ...auto-generated imports...\n// <mcp-scanner:proxy-imports:end>\n\n// <mcp-scanner:proxy-class:start>\n// ...class declaration...\n// <mcp-scanner:proxy-class:end>\n\n// <mcp-scanner:proxy-methods:start>\n// ...auto-generated methods...\n// <mcp-scanner:proxy-methods:end>\n```\n\n## Preserving Tool Metadata in Proxies\n\nWhen generating proxy methods, `mcp-scanner` automatically applies the `@Tool` decorator to preserve all original tool metadata (displayName, modelDescription, icon, canBeReferencedInPrompt).\n\n### Why `@Tool` and not `@ExposeTool`?\n\n- **`@ExposeTool`** exposes the method as a tool, which would cause the _proxy_ method to appear in `languageModelTools` in addition to the original. This is not desired.\n- **`@Tool`** preserves metadata without exposure, allowing language model tools and MCP servers to access the complete tool definition without the proxy being registered as a separate tool.\n\n### Example Generated Proxy\n\nGiven a source library method:\n\n```typescript\nclass MyLibrary {\n  @ExposeTool({\n    name: 'processData',\n    displayName: 'Process Data',\n    modelDescription: 'Transforms data according to rules.',\n    icon: '$(gear)',\n  })\n  processData(params: IDataParams): Promise<string> { ... }\n}\n```\n\nThe generated proxy preserves the metadata:\n\n```typescript\nclass MyProxyClass {\n  /**\n   * Transforms data according to rules.\n   */\n  @Tool({\n    name: 'processData',\n    displayName: 'Process Data',\n    modelDescription: 'Transforms data according to rules.',\n    icon: '$(gear)',\n  })\n  public async processData(params: IDataParams): Promise<string> {\n    // TODO: Replace with your implementation\n    return await this._bridge.dispatch('processData', params);\n  }\n}\n```\n\nThe `@Tool` decorator is automatically imported from `mcp-scanner` in the proxy file's imports section.\n\n\n## MCP Tools (serve the same tools over MCP)\n\nThe same `@ExposeTool`/`@Tool` metadata that drives VS Code Language Model tools can also feed an\nembedded **MCP server** — write the handler once, serve it via both the VS Code LM API and MCP.\n\nBy default a tool targets the `lm` transport (goes into `package.json`). To serve a tool over MCP,\nset its `transports`. A tool can target one or both:\n\n```typescript\nclass MyService {\n  // VS Code LM tool only (default) — goes into contributes.languageModelTools\n  @ExposeTool({ name: 'lmTool', displayName: 'LM Tool', modelDescription: '...' })\n  lmTool(params: IInput): string { /* ... */ }\n\n  // MCP only — NOT exposed as a VS Code LM tool\n  @ExposeTool({ name: 'mcpTool', displayName: 'MCP Tool', modelDescription: '...', transports: ['mcp'] })\n  mcpTool(params: IInput): string { /* ... */ }\n\n  // Both transports\n  @ExposeTool({ name: 'shared', displayName: 'Shared', modelDescription: '...', transports: ['lm', 'mcp'] })\n  shared(params: IInput): string { /* ... */ }\n}\n```\n\nTools targeting `mcp` are written to a **fully-generated JSON manifest** (`.mcp-scanner.mcp.json` by\nconvention) instead of `package.json`. `mcp`-only tools never appear in `contributes.languageModelTools`,\nso VS Code does not expose them as LM tools. The manifest carries the native MCP `inputSchema`.\n\n### Multiple MCP servers in one project\n\nA project can host several MCP servers. Assign each tool to one or more **named server groups** with\n`mcpServers`, then bind each group to its own manifest file with `--mcp-manifest name=path` (repeatable):\n\n```typescript\n@ExposeTool({ name: 'toolA', /* ... */ transports: ['mcp'], mcpServers: ['serverA'] })\n@ExposeTool({ name: 'toolB', /* ... */ transports: ['mcp'], mcpServers: ['serverB'] })\n```\n\n```bash\nmcp-scanner \\\n  --mcp-manifest serverA=./mcp/server-a.mcp.json \\\n  --mcp-manifest serverB=./mcp/server-b.mcp.json\n```\n\nThe MCP server group of a tool is resolved with this precedence:\n\n1. explicit `mcpServers` on the decorator (per-method / multi-server routing), else\n2. the CLI `--tools-tag` / `-g` value, else\n3. the `default` group.\n\nSo a per-subtree scan tagged with `-g caip` automatically routes its tools to the `caip` MCP server — no\ndecorator changes needed. This mirrors how `-g` already groups tools for tag-scoped `package.json` patching:\n\n```bash\nmcp-scanner -s src/services/modeler-tools.ts -g caip \\\n  --default-transport mcp --mcp-manifest caip=./mcp/caip.mcp.json\n```\n\nA tool that omits both `mcpServers` and `-g` falls into the `default` group (bind it with a bare\n`--mcp-manifest ./tools.mcp.json`). A tool listing multiple `mcpServers` is written into each of their manifests.\n\n> **One MCP server sourced from multiple subtrees.** Each manifest file is fully regenerated on every run,\n> so two *separate* `mcp-scanner` invocations writing to the same manifest would overwrite each other.\n> To feed one MCP server from several source subtrees, pass a repeatable `-s` in a **single** run:\n>\n> ```bash\n> mcp-scanner -s src/schema -s src/services/vscode-tools.ts \\\n>   -g caip-tools --default-transport mcp --mcp-manifest caip-tools=./mcp/caip-tools.mcp.json\n> ```\n\nFor a whole project that should be MCP-only, use `--default-transport mcp` so every tool defaults to the\n`mcp` transport without annotating each method.\n\n### Reading the manifest at runtime\n\nAn embedded MCP server can load the manifest to answer `tools/list` without parsing `package.json`:\n\n```typescript\nimport { readMcpManifestFile } from '@codearchitects/mcp-scanner';\n\nconst manifest = readMcpManifestFile('.mcp-scanner.mcp.json');\nfor (const tool of manifest?.tools ?? []) {\n  // tool.name, tool.modelDescription, tool.inputSchema (JSON Schema) → MCP tools/list\n}\n```\n\nThe manifest is a fully-generated artifact: it is overwritten on every run (no manual entries are preserved),\nunlike `package.json` where manually-added tools are kept.\n\n## How It Works\n\n1. Loads the project's `tsconfig.json` and creates a TypeScript program\n2. Walks the AST of every non-declaration source file\n3. Finds `@ExposeTool(...)` decorated methods on classes\n4. Extracts the decorator's options object (name, displayName, modelDescription, icon)\n5. Resolves the first parameter's type into a JSON Schema (`inputSchema`)\n   - Interfaces → `{ type: \"object\", properties: {...}, required: [...] }`\n   - String unions → `{ type: \"string\", enum: [...] }`\n   - Mixed-type unions (e.g. `string | number | boolean`) → `{ anyOf: [...] }`\n   - Arrays, nested types, JSDoc descriptions — all handled\n6. Routes each tool by its `transports`: `'lm'` tools are written into `package.json` `contributes.languageModelTools`; `'mcp'` tools are written into per-server MCP manifest files\n7. Replaces previously generated `'lm'` tools in `package.json` and persists generated ownership to `.mcp-scanner.state.json`\n\n## License\n\nMIT - see LICENSE.\n","readmeFilename":"README.md"}