{"_id":"jscpd-server","_rev":"13-8f34b2c09ee2956cc525921f12f04929","name":"jscpd-server","dist-tags":{"latest":"4.2.4"},"versions":{"4.0.5":{"name":"jscpd-server","version":"4.0.5","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.0.5","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"b495fae763b99c113d0dff6fdcbb31ce01506be5","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.0.5.tgz","fileCount":29,"integrity":"sha512-GmZQPSpCNfBVf9RjRbXTY6Ul1c2cs52vxVHQse10cwj8Y/xSSGt8aFlxfRyklFehX+odxE58TSB1WZ+fhRM7/A==","signatures":[{"sig":"MEYCIQCD7qcS3ImFJIRmbEDRyYSaffVFf/jKJuVw8iEquOckTQIhAPpiLGWkeTtRBER87Ytjju7HO87PlbEwB6V1RN2mMzQ8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167573},"main":"dist/src/index.js","_from":"file:jscpd-server-4.0.5.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/13d742bb6cfda8721704ad8b50be802c/jscpd-server-4.0.5.tgz","_integrity":"sha512-GmZQPSpCNfBVf9RjRbXTY6Ul1c2cs52vxVHQse10cwj8Y/xSSGt8aFlxfRyklFehX+odxE58TSB1WZ+fhRM7/A==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"10.9.4","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"22.21.1","dependencies":{"colors":"^1.4.0","morgan":"^1.10.1","express":"^4.22.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.0.1","@jscpd/finder":"4.0.1","@jscpd/tokenizer":"4.0.1","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.0.1","jscpd-sarif-reporter":"4.0.3"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.1.9","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^4.17.25","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.8","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.0.5_1768118455670_0.11704003127703344","host":"s3://npm-registry-packages-npm-production"}},"4.0.6":{"name":"jscpd-server","version":"4.0.6","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.0.6","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"a5c1f01939a777b97e93f0308c912376796c4836","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.0.6.tgz","fileCount":29,"integrity":"sha512-o1HzJ4ks3EY2g0TNxNaUXtLSP4N0q2GeW7QhaF1QCT/4ZPs5Ba9SiwJXk6N/NUQ6pYSrfF/LeoYIAsKzWvsiVQ==","signatures":[{"sig":"MEUCIQD9Bi8AB+Dgrn812ibIs5OYgC4RaFR8/ymzxpj0erd4EgIgDqAAQIYiFLneNGyREFp58BXd2LaX7VotQ2/rqKegCd0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167573},"main":"dist/src/index.js","_from":"file:jscpd-server-4.0.6.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/bf8f27286dd57de0b5f30760a0402e3e/jscpd-server-4.0.6.tgz","_integrity":"sha512-o1HzJ4ks3EY2g0TNxNaUXtLSP4N0q2GeW7QhaF1QCT/4ZPs5Ba9SiwJXk6N/NUQ6pYSrfF/LeoYIAsKzWvsiVQ==","deprecated":"wrong version of jscpd-server, use 4.0.7 or higher","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"10.9.4","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"22.21.1","dependencies":{"colors":"^1.4.0","morgan":"^1.10.1","express":"^4.22.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.0.2","@jscpd/finder":"4.0.2","@jscpd/tokenizer":"4.0.2","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.0.2","jscpd-sarif-reporter":"4.0.4"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.1.9","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^4.17.25","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.8","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.0.6_1768119073631_0.08704723422420235","host":"s3://npm-registry-packages-npm-production"}},"4.0.7":{"name":"jscpd-server","version":"4.0.7","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.0.7","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"ede236c224e92a2e44cc24e39e8c8876bf5730be","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.0.7.tgz","fileCount":29,"integrity":"sha512-/LUfFNMhOcPeVAbNvJEC4Gg3WuQY8x+Kyvz/bVhF1P2ATShEhsm2gdTSR7dF04kXClzZX/8n6ZyhEPGPqr53OQ==","signatures":[{"sig":"MEQCIGuQgWQtbemM8V+zWNFzWECcKLYhhuCdCAT6QDdOsj2oAiAhuHeJ5hMgk16uPMF4FPNiPqVn8OffYPApc/IOyqN/SA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167573},"main":"dist/src/index.js","_from":"file:jscpd-server-4.0.7.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/4e0553a2b8bf71f641034204258b7462/jscpd-server-4.0.7.tgz","_integrity":"sha512-/LUfFNMhOcPeVAbNvJEC4Gg3WuQY8x+Kyvz/bVhF1P2ATShEhsm2gdTSR7dF04kXClzZX/8n6ZyhEPGPqr53OQ==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"10.9.4","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"22.21.1","dependencies":{"colors":"^1.4.0","morgan":"^1.10.1","express":"^4.22.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.0.3","@jscpd/finder":"4.0.3","@jscpd/tokenizer":"4.0.3","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.0.3","jscpd-sarif-reporter":"4.0.5"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.1.9","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^4.17.25","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.8","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.0.7_1768119287465_0.40846125174007164","host":"s3://npm-registry-packages-npm-production"}},"4.0.8":{"name":"jscpd-server","version":"4.0.8","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.0.8","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"a489364a54cef62e7665f66e3f2ff4908216838c","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.0.8.tgz","fileCount":29,"integrity":"sha512-MjfaOupNQ/vVARsWOwZ5Ov7kjs+wFBfTNYA0Pvz8U7v2G28aeRUOTPa6tfujBtRqw6Yrhri6xzMPa5vOjJvhsA==","signatures":[{"sig":"MEYCIQCodwdfVwzAnvRc6AKyp3cZHOgIr5vFAq/jhsazR31ncgIhAPrhLimb2aienMR2htdiynodYJtmVfEr1ZYFxkUcmzuG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200702},"main":"dist/src/index.js","_from":"file:jscpd-server-4.0.8.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/38/9m750_w54w1b7hlj0l2bg5pm0000gn/T/1f1446b6f5e5ec40b4f404f092440842/jscpd-server-4.0.8.tgz","_integrity":"sha512-MjfaOupNQ/vVARsWOwZ5Ov7kjs+wFBfTNYA0Pvz8U7v2G28aeRUOTPa6tfujBtRqw6Yrhri6xzMPa5vOjJvhsA==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.6.2","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^4.3.5","colors":"^1.4.0","morgan":"^1.10.1","express":"^4.22.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.0.4","@jscpd/finder":"4.0.4","@jscpd/tokenizer":"4.0.4","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.0.4","jscpd-sarif-reporter":"4.0.6","@modelcontextprotocol/sdk":"^1.25.2"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.1.9","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^4.17.25","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.8","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^4.0.16"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.0.8_1769768920697_0.2214473738217393","host":"s3://npm-registry-packages-npm-production"}},"4.0.9":{"name":"jscpd-server","version":"4.0.9","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.0.9","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"6822595399aa08033019b3316dc32d7a32b69673","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.0.9.tgz","fileCount":29,"integrity":"sha512-9aNdo3MfKjEV66D2wM0AGXAvOhFUtaGQTf3TyLBk8iCHYUVLhWiB0cUHsftfX1KR+AzSOHgHYlUCFvNbhhjvSA==","signatures":[{"sig":"MEYCIQCA2sxWL604CfDkM8b9u9kXEz8HEVTXmWS7JkqdemptswIhAJSaCSNtK6uZzvZegu1yCgXjSpsV7qAfPEnNUfhW31b9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200699},"main":"dist/src/index.js","_from":"file:jscpd-server-4.0.9.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/38/9m750_w54w1b7hlj0l2bg5pm0000gn/T/2c45275795fbf1a3bea96611bd994872/jscpd-server-4.0.9.tgz","_integrity":"sha512-9aNdo3MfKjEV66D2wM0AGXAvOhFUtaGQTf3TyLBk8iCHYUVLhWiB0cUHsftfX1KR+AzSOHgHYlUCFvNbhhjvSA==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.6.2","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"22.20.0","dependencies":{"zod":"^4.3.6","colors":"^1.4.0","morgan":"^1.10.1","express":"^5.2.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.0.5","@jscpd/finder":"4.0.5","@jscpd/tokenizer":"4.0.5","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.0.5","jscpd-sarif-reporter":"4.0.7","@modelcontextprotocol/sdk":"^1.26.0"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.1.9","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.9","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^4.0.18"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.0.9_1775822603503_0.5490491245792462","host":"s3://npm-registry-packages-npm-production"}},"4.1.0":{"name":"jscpd-server","version":"4.1.0","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.1.0","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"7a41b92a924625dd7c36ca87fba791749efbf95f","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.1.0.tgz","fileCount":29,"integrity":"sha512-guyorDu+OQQ2aB/5p34U+qu9Ce2u6Z1E1IaZpscaoMSevsqTrHaE3YyQkMPQtFlIvBh/pjLmK3LuqlaD14n6Ew==","signatures":[{"sig":"MEUCIA15f5qlNLd3cX01+SO/9Qukqt5OA3e9ZjRI/Z87+sppAiEA6ejMafFDKehPBjgEnaZ59oNVZgiEJs0kklNWMoUHWTU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200558},"main":"dist/src/index.js","_from":"file:jscpd-server-4.1.0.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/4ea6841548168bc0be2e252ec0b91e19/jscpd-server-4.1.0.tgz","_integrity":"sha512-guyorDu+OQQ2aB/5p34U+qu9Ce2u6Z1E1IaZpscaoMSevsqTrHaE3YyQkMPQtFlIvBh/pjLmK3LuqlaD14n6Ew==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.11.0","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"25.8.1","dependencies":{"zod":"^4.3.6","colors":"^1.4.0","morgan":"^1.10.1","express":"^5.2.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.1.0","@jscpd/finder":"4.1.0","@jscpd/tokenizer":"4.1.0","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.1.0","jscpd-sarif-reporter":"4.1.0","@modelcontextprotocol/sdk":"^1.26.0"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.1.9","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.9","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.1.0_1778351020795_0.8310629221598296","host":"s3://npm-registry-packages-npm-production"}},"4.1.1":{"name":"jscpd-server","version":"4.1.1","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.1.1","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"7c6b592e332153036abf612da7e047daf2d23bbe","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.1.1.tgz","fileCount":29,"integrity":"sha512-kRkw1NPdFyDqEYrq0BeWa3qAogp2SQL6X5l4XUJp+deEyvOaWySAz7mtIHKrvZrFeRupPaT2uZiI5JVFC9zI6g==","signatures":[{"sig":"MEUCIBp+RwpdqETCFXbYyrkJ+eqEv0ZGQ2FP9ZMrMlwiJtoHAiEAqGg/u8jcFbu1D05BYQX/59KS2wRal2hb5ZOcNSCAOWc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":200558},"main":"dist/src/index.js","_from":"file:jscpd-server-4.1.1.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/da71773cf37967734a14ab1e57afbc3c/jscpd-server-4.1.1.tgz","_integrity":"sha512-kRkw1NPdFyDqEYrq0BeWa3qAogp2SQL6X5l4XUJp+deEyvOaWySAz7mtIHKrvZrFeRupPaT2uZiI5JVFC9zI6g==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.12.1","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"26.0.0","dependencies":{"zod":"^4.3.6","colors":"^1.4.0","morgan":"^1.10.1","express":"^5.2.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.1.1","@jscpd/finder":"4.1.1","@jscpd/tokenizer":"4.1.1","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.1.1","jscpd-sarif-reporter":"4.1.1","@modelcontextprotocol/sdk":"^1.26.0"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^2.1.9","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.9","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^2.1.9"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.1.1_1778565465923_0.8441609277239976","host":"s3://npm-registry-packages-npm-production"}},"4.2.0":{"name":"jscpd-server","version":"4.2.0","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.2.0","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"b2b8537885fbb2549a2d6c6b34c148e776344ee1","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.2.0.tgz","fileCount":29,"integrity":"sha512-bPYmp+Zc+e6gxc5L3HpyP522NnhxBubBHYTHjnAWRfSxbMRn8qWYOS1f466+5vDCtptI/bGVeT7brhUFiZT7UQ==","signatures":[{"sig":"MEUCIEygDfxw0lLAEL1h/Wlr4MWahTSIN/w+Pw2/MxsHYoD4AiEA0DbMHjAvZEcN8xQ8HtCIoLnDBQxz/u+6PHSIOI5s+E8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202569},"main":"dist/src/index.js","_from":"file:jscpd-server-4.2.0.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/e44615eb15f459264ba0d4b5f280e293/jscpd-server-4.2.0.tgz","_integrity":"sha512-bPYmp+Zc+e6gxc5L3HpyP522NnhxBubBHYTHjnAWRfSxbMRn8qWYOS1f466+5vDCtptI/bGVeT7brhUFiZT7UQ==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.12.1","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"26.0.0","dependencies":{"zod":"^4.3.6","colors":"^1.4.0","morgan":"^1.10.1","express":"^5.2.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.2.0","@jscpd/finder":"4.2.0","@jscpd/tokenizer":"4.2.0","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.2.0","jscpd-sarif-reporter":"4.2.0","@modelcontextprotocol/sdk":"^1.26.0"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^3.2.4","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.9","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.2.0_1778757605899_0.06676921078449238","host":"s3://npm-registry-packages-npm-production"}},"4.2.1":{"name":"jscpd-server","version":"4.2.1","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.2.1","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"56407a4388598273037c0213b5eb32d10379c4b4","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.2.1.tgz","fileCount":29,"integrity":"sha512-SOwSyaNmLoBZeNLt5yVjW009YKNmAeQ91UZNU0n2ODiR8U8q6Y8Hb2RxCKfAG5IRAFtqEwMrsMEVAytZwiTyUQ==","signatures":[{"sig":"MEUCIH0nkXA7j8VlSiJcShEXMehjdcs8+BOlYzULLydslBSxAiEAh1dGT1o3yLE4xyqzNUG3lqEEena4E0LLLo9/ZLuP7Fc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202559},"main":"dist/src/index.js","_from":"file:jscpd-server-4.2.1.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/8df546137e117dbbeaa15b49e80d05f3/jscpd-server-4.2.1.tgz","_integrity":"sha512-SOwSyaNmLoBZeNLt5yVjW009YKNmAeQ91UZNU0n2ODiR8U8q6Y8Hb2RxCKfAG5IRAFtqEwMrsMEVAytZwiTyUQ==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.12.1","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"26.0.0","dependencies":{"zod":"^4.3.6","colors":"^1.4.0","morgan":"^1.10.1","express":"^5.2.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.2.1","@jscpd/finder":"4.2.1","@jscpd/tokenizer":"4.2.1","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.2.1","jscpd-sarif-reporter":"4.2.1","@modelcontextprotocol/sdk":"^1.26.0"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^3.2.4","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.9","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.2.1_1778851961938_0.0839313916985045","host":"s3://npm-registry-packages-npm-production"}},"4.2.2":{"name":"jscpd-server","version":"4.2.2","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.2.2","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"6f7e8bbd94bf4b60dc3f3bbe1a87699a38a62ec6","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.2.2.tgz","fileCount":29,"integrity":"sha512-bq2wYQf3NU+/vst0nXQV8QCIyr86ntz0+IRL7k26Npk1FQyzcmB2duMhsEIcryJnVs7IixxKryz4doY5QLIzMA==","signatures":[{"sig":"MEQCIDZgoHCJvRJcmjCcOa0w5XzpxAJoVC3s19lhUtEWBEM9AiAo4hwxzYVQZMCnIGkrHeiRxa/AzlU5j1CHcFIH4m4mAg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202559},"main":"dist/src/index.js","_from":"file:jscpd-server-4.2.2.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/3cf39eb5240100abc49aa501db8f1651/jscpd-server-4.2.2.tgz","_integrity":"sha512-bq2wYQf3NU+/vst0nXQV8QCIyr86ntz0+IRL7k26Npk1FQyzcmB2duMhsEIcryJnVs7IixxKryz4doY5QLIzMA==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.12.1","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"26.0.0","dependencies":{"zod":"^4.3.6","colors":"^1.4.0","morgan":"^1.10.1","express":"^5.2.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.2.2","@jscpd/finder":"4.2.2","@jscpd/tokenizer":"4.2.2","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.2.2","jscpd-sarif-reporter":"4.2.2","@modelcontextprotocol/sdk":"^1.26.0"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^3.2.4","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.9","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.2.2_1778872632589_0.8767220734958578","host":"s3://npm-registry-packages-npm-production"}},"4.2.3":{"name":"jscpd-server","version":"4.2.3","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","_id":"jscpd-server@4.2.3","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"homepage":"https://github.com/kucherenko/jscpd#readme","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"bin":{"jscpd-server":"bin/jscpd-server"},"dist":{"shasum":"23359966fd59799d68cd4009945475a30b987e83","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.2.3.tgz","fileCount":29,"integrity":"sha512-aAnMarkX39PmTX34krqmkeTe7xfiB0IwvL2IwDr93UJRUq84dzAJCgQwUarvkax9AvvRXMDmukL2XDiPLDjZYg==","signatures":[{"sig":"MEQCICTmMcqUbyNTKDSlrDjFXgu3qyX5w4rHDf/CQf8gY37dAiBWMCHuXwyaSlFxlx/Nc+Qhm64iHqoFIP9Z597xQkKF0Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":202559},"main":"dist/src/index.js","_from":"file:jscpd-server-4.2.3.tgz","module":"dist/src/index.mjs","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"scripts":{"dev":"nodemon","test":"vitest run","build":"tsup-node --dts","cleanup":"rimraf ./dist .turbo","typecheck":"tsc"},"typings":"dist/src/index.d.mts","_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/ac6c08e61ebc9fc8310d85de6baef46f/jscpd-server-4.2.3.tgz","_integrity":"sha512-aAnMarkX39PmTX34krqmkeTe7xfiB0IwvL2IwDr93UJRUq84dzAJCgQwUarvkax9AvvRXMDmukL2XDiPLDjZYg==","repository":{"url":"git+ssh://git@github.com/kucherenko/jscpd.git","type":"git"},"_npmVersion":"11.12.1","description":"jscpd server application","directories":{"bin":"bin","lib":"src","test":"__tests__"},"_nodeVersion":"26.0.0","dependencies":{"zod":"^4.3.6","colors":"^1.4.0","morgan":"^1.10.1","express":"^5.2.1","fs-extra":"^11.3.3","commander":"^5.1.0","@jscpd/core":"4.2.3","@jscpd/finder":"4.2.3","@jscpd/tokenizer":"4.2.3","gitignore-to-glob":"^0.3.0","@jscpd/html-reporter":"4.2.3","jscpd-sarif-reporter":"4.2.3","@modelcontextprotocol/sdk":"^1.26.0"},"preferGlobal":true,"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","vitest":"^3.2.4","nodemon":"^3.1.11","ts-node":"^10.9.2","supertest":"^7.2.2","typescript":"^5.9.3","@types/node":"^24.10.4","@types/morgan":"^1.9.10","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@tsconfig/node20":"^20.1.9","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^3.2.4"},"_npmOperationalInternal":{"tmp":"tmp/jscpd-server_4.2.3_1779020080915_0.07276298507550027","host":"s3://npm-registry-packages-npm-production"}},"4.2.4":{"name":"jscpd-server","version":"4.2.4","description":"jscpd server application","author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"homepage":"https://github.com/kucherenko/jscpd#readme","license":"MIT","main":"dist/src/index.js","module":"dist/src/index.mjs","typings":"dist/src/index.d.mts","exports":{".":{"types":"./dist/src/index.d.mts","import":"./dist/src/index.mjs","require":"./dist/src/index.js"}},"bin":{"jscpd-server":"bin/jscpd-server"},"directories":{"lib":"src","bin":"bin","test":"__tests__"},"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+ssh://git@github.com/kucherenko/jscpd.git"},"dependencies":{"@modelcontextprotocol/sdk":"^1.26.0","colors":"^1.4.0","commander":"^5.1.0","express":"^5.2.1","fs-extra":"^11.3.3","gitignore-to-glob":"^0.3.0","morgan":"^1.10.1","zod":"^4.3.6","@jscpd/tokenizer":"4.2.4","@jscpd/html-reporter":"4.2.4","@jscpd/core":"4.2.4","@jscpd/finder":"4.2.4","jscpd-sarif-reporter":"4.2.4"},"devDependencies":{"@tsconfig/node20":"^20.1.9","@types/express":"^5.0.6","@types/fs-extra":"^11.0.4","@types/morgan":"^1.9.10","@types/node":"^24.10.4","@types/supertest":"^6.0.3","@vitest/coverage-v8":"^3.2.4","nodemon":"^3.1.11","supertest":"^7.2.2","ts-node":"^10.9.2","tsup":"^8.5.1","typescript":"^5.9.3","vitest":"^3.2.4"},"preferGlobal":true,"scripts":{"build":"tsup-node --dts","dev":"nodemon","test":"vitest run","typecheck":"tsc","cleanup":"rimraf ./dist .turbo"},"_id":"jscpd-server@4.2.4","bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"_integrity":"sha512-iVK7vmMs7pazVv1P7ClCa2HMO6M3aUanmX4XDbCM47gq2AAgdllzP5HRwkNflgzEOy4FNwwK4vKWP0LbA+dnHw==","_resolved":"/private/var/folders/rh/82vm3q314snd3ymwr5n577_00000gp/T/f7855a60f35d484add05acbd328d5cb6/jscpd-server-4.2.4.tgz","_from":"file:jscpd-server-4.2.4.tgz","_nodeVersion":"26.0.0","_npmVersion":"11.12.1","dist":{"integrity":"sha512-iVK7vmMs7pazVv1P7ClCa2HMO6M3aUanmX4XDbCM47gq2AAgdllzP5HRwkNflgzEOy4FNwwK4vKWP0LbA+dnHw==","shasum":"a96a0de39e9df651170fb2b8a5233bf2c6e17dfa","tarball":"https://registry.npmjs.org/jscpd-server/-/jscpd-server-4.2.4.tgz","fileCount":29,"unpackedSize":202559,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC66aKvp30FVe5+yGsPs8W9KvgSUUoYm35otPlZ2m0gJwIhALuIi1H/u5IBRHJA5c78QFDruu1WsGsolWI2QoINq+lz"}]},"_npmUser":{"name":"apk","email":"kucherenko.andrey@gmail.com"},"maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jscpd-server_4.2.4_1779716328725_0.6691593037907821"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-11T08:00:55.525Z","modified":"2026-05-25T13:38:49.004Z","4.0.5":"2026-01-11T08:00:55.827Z","4.0.6":"2026-01-11T08:11:13.787Z","4.0.7":"2026-01-11T08:14:47.624Z","4.0.8":"2026-01-30T10:28:40.863Z","4.0.9":"2026-04-10T12:03:23.641Z","4.1.0":"2026-05-09T18:23:40.936Z","4.1.1":"2026-05-12T05:57:46.091Z","4.2.0":"2026-05-14T11:20:06.069Z","4.2.1":"2026-05-15T13:32:42.143Z","4.2.2":"2026-05-15T19:17:12.735Z","4.2.3":"2026-05-17T12:14:41.074Z","4.2.4":"2026-05-25T13:38:48.905Z"},"bugs":{"url":"https://github.com/kucherenko/jscpd/issues"},"author":{"name":"Andrey Kucherenko","email":"kucherenko.andrey@gmail.com"},"license":"MIT","homepage":"https://github.com/kucherenko/jscpd#readme","repository":{"type":"git","url":"git+ssh://git@github.com/kucherenko/jscpd.git"},"description":"jscpd server application","maintainers":[{"name":"apk","email":"kucherenko.andrey@gmail.com"}],"readme":"# JSCPD Server\n\n## Overview\n\nThe JSCPD Server is a standalone REST API server for on-demand code duplication detection. It scans a codebase on startup, then accepts snippet check requests via HTTP and [Model Context Protocol (MCP)](https://modelcontextprotocol.io).\n\n**AI-ready**: the server exposes an MCP endpoint that AI assistants (Claude Desktop, Cursor, Copilot, etc.) can use to detect duplication directly from the editor. See the [MCP Server](#mcp-server) section.\n\n## Starting the Server\n\n### Command Line\n\n```bash\n# Start server in current directory\njscpd-server\n\n# Start server in specific directory\njscpd-server /path/to/project\n\n# Start server on specific port\njscpd-server . --port 8080\n\n# Start server with custom host\njscpd-server . --host localhost --port 3000\n\n# Start server with persistent storage (recommended for production)\njscpd-server . --store leveldb\n```\n\n### Server-Specific Options\n\n- `-p, --port [number]` - Port to run the server on (Default: 3000)\n- `-H, --host [string]` - Host to bind the server to (Default: 0.0.0.0)\n\n### Common Options (Available for Server)\n\n- `--store [string]` - Persistent store for codebase data (e.g., `leveldb` for disk persistence). Without this option, the server uses in-memory storage which is lost on restart\n- `-c, --config [string]` - Path to config file (Default is .jscpd.json in <path>)\n- `-f, --format [string]` - Format or formats separated by comma\n- `-i, --ignore [string]` - Glob pattern for files to exclude\n- `--ignore-pattern [string]` - Ignore code blocks matching regexp patterns\n- `-l, --min-lines [number]` - Min size of duplication in code lines\n- `-k, --min-tokens [number]` - Min size of duplication in code tokens\n- `-x, --max-lines [number]` - Max size of source in lines\n- `-z, --max-size [string]` - Max size of source in bytes\n- `-m, --mode [string]` - Mode of quality of search (strict, mild, weak)\n- `-a, --absolute` - Use absolute path in reports\n- `-n, --noSymlinks` - Don't use symlinks for detection\n- `--ignoreCase` - Ignore case of symbols in code\n- `-g, --gitignore` - Ignore all files from .gitignore file\n- `--skipLocal` - Skip duplicates in local folders\n\n## Base URL\n\nWhen running locally: `http://localhost:3000/api`\n\n## Content Type\n\nAll API responses return `Content-Type: application/json`. The server accepts both `application/json` and `application/x-www-form-urlencoded` request bodies.\n\n## Request Body Size Limit\n\nThe server accepts request bodies up to 10MB in size.\n\n## Authentication\n\nCurrently, no authentication is required. Future versions may add authentication support.\n\n## Endpoints\n\n### 1. Check Code Snippet\n\nCheck a code snippet for duplications against the scanned codebase.\n\n**Endpoint:** `POST /api/check`\n\n**Request Headers:**\n```http\nContent-Type: application/json\n```\n\n**Request Body:**\n\n```json\n{\n  \"code\": \"string (required)\",\n  \"format\": \"string (required)\"\n}\n```\n\n**Parameters:**\n\n- `code` (required, string): The code snippet to check for duplications. This field cannot be empty or whitespace-only.\n- `format` (required, string): Programming language/format of the snippet (e.g., \"javascript\", \"python\", \"java\")\n\n**Example Request:**\n\n```bash\ncurl -X POST http://localhost:3000/api/check \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"code\": \"function hello() {\\n  console.log(\\\"Hello, World!\\\");\\n}\",\n    \"format\": \"javascript\"\n  }'\n```\n\n**Success Response (200 OK):**\n\n```json\n{\n  \"duplications\": [\n    {\n      \"snippetLocation\": {\n        \"startLine\": 1,\n        \"endLine\": 5,\n        \"startColumn\": 0,\n        \"endColumn\": 20\n      },\n      \"codebaseLocation\": {\n        \"file\": \"src/utils/helper.js\",\n        \"startLine\": 10,\n        \"endLine\": 14,\n        \"startColumn\": 0,\n        \"endColumn\": 20,\n        \"fragment\": \"function hello() {\\n  console.log(\\\"Hello, World!\\\");\\n}\"\n      },\n      \"linesCount\": 4\n    }\n  ],\n  \"statistics\": {\n    \"totalDuplications\": 1,\n    \"duplicatedLines\": 4,\n    \"totalLines\": 5,\n    \"percentageDuplicated\": 80.0\n  }\n}\n```\n\n**400 Bad Request** - Validation error (missing field):\n```json\n{\n  \"error\": \"ValidationError\",\n  \"message\": \"Missing required field: code\",\n  \"statusCode\": 400\n}\n```\n\n**400 Bad Request** - Validation error (wrong type):\n```json\n{\n  \"error\": \"ValidationError\",\n  \"message\": \"Field \\\"code\\\" must be a string\",\n  \"statusCode\": 400\n}\n```\n\n**400 Bad Request** - Validation error (empty code):\n```json\n{\n  \"error\": \"ValidationError\",\n  \"message\": \"Field \\\"code\\\" cannot be empty\",\n  \"statusCode\": 400\n}\n```\n\n**400 Bad Request** - Server not initialized:\n```json\n{\n  \"error\": \"Error\",\n  \"message\": \"Server not initialized. Please wait for initial scan to complete.\",\n  \"statusCode\": 400\n}\n```\n\n**400 Bad Request** - Processing error:\n```json\n{\n  \"error\": \"CheckError\",\n  \"message\": \"Error details...\",\n  \"statusCode\": 400\n}\n```\n\n#### Snippet Isolation and Memory Management\n\nThe `/api/check` endpoint implements **request isolation** to ensure:\n\n1. **No Cross-Request Contamination**: Snippet tokens are isolated per request and never stored in the shared project store. Each request compares only against the scanned codebase, not against tokens from previous snippet checks.\n\n2. **Automatic Cleanup**: Snippet token data is automatically discarded when the request completes (via finally block), preventing unbounded memory growth.\n\n3. **Concurrent Request Safety**: Multiple concurrent snippet checks are isolated from each other. The same snippet checked simultaneously will produce identical results without interference.\n\n4. **Consistent Results**: Checking the same snippet multiple times will always produce identical duplication reports, as snippet tokens don't persist between requests.\n\n**Implementation Details**:\n\nThe server uses an ephemeral hybrid store for each snippet check:\n- **Reads** are delegated to the shared project store (to detect duplications against the codebase)\n- **Writes** (snippet tokens) go to a temporary in-memory store\n- The temporary store is discarded after the request completes\n\nThis architecture ensures snippet detection remains stateless and memory-safe while still detecting duplications against the full project.\n\n### 2. Get Project Statistics\n\nGet overall duplication statistics for the scanned codebase.\n\n**Endpoint:** `GET /api/stats`\n\n**Request Headers:** None required\n\n**Example Request:**\n\n```bash\ncurl http://localhost:3000/api/stats\n```\n\n**Success Response (200 OK):**\n\nThe response includes the full statistics object from the initial scan. The structure follows the standard jscpd statistics format.\n\n```json\n{\n  \"statistics\": {\n    \"detectionDate\": \"2025-11-17T10:30:00.000Z\",\n    \"total\": {\n      \"lines\": 10000,\n      \"tokens\": 50000,\n      \"sources\": 50,\n      \"duplicatedLines\": 500,\n      \"duplicatedTokens\": 2500,\n      \"clones\": 10,\n      \"percentage\": 5.0,\n      \"percentageTokens\": 5.0,\n      \"newDuplicatedLines\": 0,\n      \"newClones\": 0\n    },\n    \"formats\": {\n      \"javascript\": {\n        \"total\": {\n          \"lines\": 5000,\n          \"tokens\": 25000,\n          \"sources\": 30,\n          \"duplicatedLines\": 300,\n          \"duplicatedTokens\": 1500,\n          \"clones\": 6,\n          \"percentage\": 6.0,\n          \"percentageTokens\": 6.0,\n          \"newDuplicatedLines\": 0,\n          \"newClones\": 0\n        },\n        \"sources\": {\n          \"src/file1.js\": {\n            \"lines\": 100,\n            \"tokens\": 500,\n            \"sources\": 1,\n            \"duplicatedLines\": 10,\n            \"duplicatedTokens\": 50,\n            \"clones\": 1,\n            \"percentage\": 10.0,\n            \"percentageTokens\": 10.0,\n            \"newDuplicatedLines\": 0,\n            \"newClones\": 0\n          }\n        }\n      }\n    }\n  },\n  \"timestamp\": \"2025-11-17T10:30:00.000Z\"\n}\n```\n\n**Error Responses:**\n\n**503 Service Unavailable** - Statistics not ready:\n```json\n{\n  \"error\": \"NotReady\",\n  \"message\": \"Statistics not available yet. Server is still initializing.\",\n  \"statusCode\": 503\n}\n```\n\n### 4. Health Check\n\nCheck server health and initialization status.\n\n**Endpoint:** `GET /api/health`\n\n**Request Headers:** None required\n\n**Example Request:**\n\n```bash\ncurl http://localhost:3000/api/health\n```\n\n**Success Response (200 OK):**\n\n```json\n{\n  \"status\": \"ready\",\n  \"workingDirectory\": \"/path/to/project\",\n  \"lastScanTime\": \"2025-11-17T10:30:00.000Z\"\n}\n```\n\n**Status Values:**\n- `initializing` - Server is scanning the codebase\n- `ready` - Server is ready to accept requests\n\n### 5. API Information\n\nGet information about the API and available endpoints.\n\n**Endpoint:** `GET /`\n\n**Request Headers:** None required\n\n**Example Request:**\n\n```bash\ncurl http://localhost:3000/\n```\n\n**Success Response (200 OK):**\n\n```json\n{\n  \"name\": \"jscpd-server\",\n  \"version\": \"1.0.0\",\n  \"endpoints\": {\n    \"POST /api/check\": \"Check code snippet for duplications\",\n    \"GET /api/stats\": \"Get overall project statistics\",\n    \"GET /api/health\": \"Server health check\"\n  },\n  \"documentation\": \"https://github.com/kucherenko/jscpd\"\n}\n```\n\n## MCP Server\n\nThe server also supports the [Model Context Protocol (MCP)](https://github.com/modelcontextprotocol), allowing it to fit into LLM-based workflows.\n\n### MCP Endpoint\n\n**Endpoint:** `POST /mcp`\n\nThe server handles MCP requests via the `/mcp` endpoint using the protocol's streamable HTTP transport.\n\n### Configuration\n\nTo use with Claude Desktop, add the following to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"jscpd\": {\n      \"type\": \"streamable-http\",\n      \"url\": \"http://localhost:3000/mcp\"\n    }\n  }\n}\n```\n\nEnsure `jscpd-server` is running (e.g., `npx jscpd-server . --port 3000`) before starting Claude Desktop.\n\n### MCP Tools\n\n#### `check_duplication`\nCheck code snippet for duplications against the codebase.\n- **Input**:\n  - `code` (string): Source code snippet.\n  - `format` (string): Format/language of the code.\n\n#### `get_statistics`\nGet overall project duplication statistics.\n- **Input**: None\n\n#### `check_current_directory`\nTrigger a re-scan of the current working directory for duplications.\n- **Input**: None\n\n## Response Schemas\n\n### CheckSnippetResponse\n\n```typescript\n{\n  duplications: Array<{\n    snippetLocation: {\n      startLine: number;\n      endLine: number;\n      startColumn: number;\n      endColumn: number;\n    };\n    codebaseLocation: {\n      file: string;\n      startLine: number;\n      endLine: number;\n      startColumn: number;\n      endColumn: number;\n      fragment?: string;\n    };\n    linesCount: number;\n  }>;\n  statistics: {\n    totalDuplications: number;\n    duplicatedLines: number;\n    totalLines: number;\n    percentageDuplicated: number;\n  };\n}\n```\n\n### ErrorResponse\n\n```typescript\n{\n  error: string;\n  message: string;\n  statusCode: number;\n}\n```\n\n## Supported Languages\n\nThe server supports all languages that jscpd supports. When checking a snippet, specify the language using the `format` parameter with the language name or file extension.\n\nCommon format identifiers:\n- JavaScript: `javascript`, `js`\n- TypeScript: `typescript`, `ts`\n- Python: `python`, `py`\n- Java: `java`\n- C/C++: `c`, `cpp`\n- C#: `csharp`, `cs`\n- PHP: `php`\n- Ruby: `ruby`, `rb`\n- Go: `go`\n- Rust: `rust`, `rs`\n\nFor a complete list, see the [supported formats documentation](../../FORMATS.md).\n\n## Error Handling\n\nAll errors follow a consistent format with an HTTP status code and JSON body:\n\n```json\n{\n  \"error\": \"ErrorType\",\n  \"message\": \"Human-readable error message\",\n  \"statusCode\": 400\n}\n```\n\n### Common Error Types\n\n- `ValidationError` (400) - Invalid request parameters (missing fields, wrong types, empty values)\n- `CheckError` (400) - Error processing the check request\n- `Error` (400) - Server not initialized or general errors\n- `NotReady` (503) - Statistics not available yet (server still initializing)\n- `NotFound` (404) - Endpoint not found\n- `StatsError` (500) - Error retrieving statistics\n- `InternalServerError` (500) - Unexpected server error\n\n## Rate Limiting\n\nCurrently, no rate limiting is implemented. Consider implementing rate limiting in production environments.\n\n## Persistent Storage with LevelDB\n\n### Why Use Persistent Storage?\n\nBy default, the server uses in-memory storage (MemoryStore) for the codebase scan results. This means:\n- ✅ **Fast** - All data is in memory\n- ❌ **Volatile** - Data is lost when the server restarts\n- ❌ **Memory-intensive** - Large codebases consume significant RAM\n\nWith `--store leveldb`, the server uses disk-based storage (LevelDB):\n- ✅ **Persistent** - Data survives server restarts\n- ✅ **Memory-efficient** - Data is stored on disk\n- ✅ **No re-scanning** - Server starts immediately with cached data\n- ⚠️ **Slightly slower** - Disk I/O overhead (minimal impact)\n\n### Installation\n\n```bash\n# Install the LevelDB store package\nnpm install @jscpd/leveldb-store\n```\n\n### Usage\n\n```bash\n# Start server with LevelDB persistence\njscpd server /path/to/project --store leveldb --port 3000\n\n# On first start, the server will:\n# 1. Scan the codebase\n# 2. Store results in .jscpd/ directory\n# 3. Accept requests\n\n# On subsequent restarts, the server will:\n# 1. Load cached data from .jscpd/ directory\n# 2. Accept requests immediately (no re-scan needed)\n```\n\n### Storage Location\n\nLevelDB stores data in the `.jscpd/` directory relative to where the server is started. This directory contains:\n- Token databases for each file format\n- Duplication detection data\n\n**Important**: Add `.jscpd/` to your `.gitignore` file:\n\n```bash\necho \".jscpd/\" >> .gitignore\n```\n\n### Cleanup\n\nTo clear cached data and force a fresh scan:\n\n```bash\n# Stop the server, then:\nrm -rf .jscpd/\n```\n\n## Examples\n\n### Example 1: Check JavaScript Code\n\n```javascript\nconst axios = require('axios');\n\nconst checkCode = async () => {\n  try {\n    const response = await axios.post('http://localhost:3000/api/check', {\n      code: `\nfunction calculateSum(a, b) {\n  return a + b;\n}\n      `,\n      format: 'javascript'\n    });\n\n    console.log('Duplications found:', response.data.duplications.length);\n    console.log('Percentage duplicated:', response.data.statistics.percentageDuplicated + '%');\n  } catch (error) {\n    console.error('Error:', error.response.data);\n  }\n};\n\ncheckCode();\n```\n\n### Example 2: Check Python Code\n\n```python\nimport requests\n\ndef check_code():\n    url = 'http://localhost:3000/api/check'\n    payload = {\n        'code': '''\ndef hello_world():\n    print(\"Hello, World!\")\n        ''',\n        'format': 'python'\n    }\n\n    response = requests.post(url, json=payload)\n\n    if response.status_code == 200:\n        data = response.json()\n        print(f\"Duplications found: {len(data['duplications'])}\")\n        print(f\"Percentage duplicated: {data['statistics']['percentageDuplicated']}%\")\n    else:\n        print(f\"Error: {response.json()}\")\n\ncheck_code()\n```\n\n### Example 3: Get Project Statistics\n\n```bash\n#!/bin/bash\n\n# Get statistics\ncurl -s http://localhost:3000/api/stats | jq '.statistics.total'\n\n# Output:\n# {\n#   \"lines\": 10000,\n#   \"tokens\": 50000,\n#   \"sources\": 50,\n#   \"duplicatedLines\": 500,\n#   \"duplicatedTokens\": 2500,\n#   \"clones\": 10,\n#   \"percentage\": 5.0,\n#   ...\n# }\n```\n\n## Integration with CI/CD\n\n### GitHub Actions Example\n\n```yaml\nname: Check Code Duplication\n\non: [push, pull_request]\n\njobs:\n  check-duplication:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2\n\n      - name: Setup Node.js\n        uses: actions/setup-node@v2\n        with:\n          node-version: '18'\n\n      - name: Install jscpd\n        run: npm install -g jscpd\n\n      - name: Start jscpd server\n        run: |\n          jscpd server . --port 3000 &\n          sleep 10  # Wait for server to initialize\n\n      - name: Check new code\n        run: |\n          # Check files changed in this PR\n          for file in $(git diff --name-only HEAD~1); do\n            if [[ -f \"$file\" ]]; then\n              # Extract file extension to determine format\n              ext=\"${file##*.}\"\n              curl -X POST http://localhost:3000/api/check \\\n                -H \"Content-Type: application/json\" \\\n                -d \"{\\\"code\\\": \\\"$(cat $file | jq -Rs .)\\\", \\\"format\\\": \\\"$ext\\\"}\" \\\n                | jq .\n            fi\n          done\n```\n\n## Best Practices\n\n1. **Initialize Once**: The server scans the codebase on startup. For large codebases, this may take time. Check the `/api/health` endpoint to verify the server is ready before sending requests.\n\n2. **Format Parameter**: Always provide the `format` parameter with a valid language identifier or file extension.\n\n3. **Snippet Size**: Large snippets take longer to process. Maximum body size is 10MB.\n\n4. **Error Handling**: Always handle errors appropriately, especially 400 errors when the server is not initialized or validation fails.\n\n5. **Production Use**: For production use, consider:\n   - Using persistent storage with `--store leveldb` to avoid rescanning on restarts\n   - Adding authentication\n   - Implementing rate limiting\n   - Using a reverse proxy (nginx, Apache)\n   - Monitoring and logging\n   - Running behind HTTPS\n\n## Troubleshooting\n\n### Server won't start\n\n- **Port already in use**: Try a different port with `--port`\n- **Permission denied**: Use a port above 1024 or run with appropriate permissions\n\n### No duplications found\n\n- Ensure `format` is correctly specified with a valid language identifier\n- Check that the codebase was successfully scanned (check server logs)\n- Verify minimum thresholds (`--min-lines`, `--min-tokens`)\n\n### 400 Bad Request - Server not initialized\n\n- Wait for the initial scan to complete\n- Check `/api/health` endpoint - status should be `ready` not `initializing`\n\n### Validation errors\n\n- Ensure `code` field is a non-empty string\n- Ensure `format` field is provided and is a string\n- Check that the request body is valid JSON\n\n## Performance Considerations\n\n- **Initial Scan Time**: Depends on codebase size. Large codebases may take several minutes.\n- **Memory Usage**: The server keeps the scanned codebase in memory by default. Monitor memory usage for large projects. Snippet checks use ephemeral stores that are automatically garbage-collected, preventing unbounded memory growth from snippet tokens.\n- **Check Response Time**: Typically < 1 second for small snippets, longer for larger snippets.\n- **Concurrent Requests**: Snippet checks are isolated and thread-safe. Multiple concurrent requests do not interfere with each other.\n- **Persistent Storage**: Use `--store leveldb` for disk-based persistence. This allows the server to survive restarts without rescanning the codebase. LevelDB is recommended for large repositories. To use LevelDB, ensure `@jscpd/leveldb-store` is installed: `npm install @jscpd/leveldb-store`\n\n## Support\n\nFor issues, questions, or feature requests, please visit:\n- GitHub Issues: [https://github.com/kucherenko/jscpd/issues](https://github.com/kucherenko/jscpd/issues)\n- Documentation: [https://github.com/kucherenko/jscpd](https://github.com/kucherenko/jscpd)\n","readmeFilename":"README.md"}