{"_id":"sparda-mcp","_rev":"49-bcdf222007c269d59fc7b648c9b67aa4","name":"sparda-mcp","dist-tags":{"latest":"0.73.0"},"versions":{"0.1.0":{"name":"sparda-mcp","version":"0.1.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"MIT","_id":"sparda-mcp@0.1.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"bin":{"sparda":"src/index.js"},"dist":{"shasum":"e33f36f5af9682f9afde2afa87c17d6e131b055a","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.1.0.tgz","fileCount":13,"integrity":"sha512-QWNkWqxfqRizDPw6tOpHdD39U28f37nxStZPvq0+JfL1Fzsdsg1zd/GNvo9CWNP1r3D6ZoS4IzOZ/6YWAt3kBA==","signatures":[{"sig":"MEQCIGi3iAG2QQF/meikbVy42tn0dfOFPYEnLfpXWoyMS3poAiBDeYhfI3ZPOaFb1jyY5L9ukzqz3EUR4zbcjDyq6C/tMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37575},"type":"module","engines":{"node":">=18"},"gitHead":"039ed3107ae3b1886356f738ee0d0c60699d5995","scripts":{"test":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.12.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.6"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.1.0_1781136372505_0.3606160314553133","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"sparda-mcp","version":"0.3.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.3.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"bin":{"sparda":"src/index.js"},"dist":{"shasum":"f775acdb61d151de1ace5ff63ca5559b1021e68d","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.3.0.tgz","fileCount":21,"integrity":"sha512-N+tw/XX4XTwZW/M6dbcun6Ia6QmqpWdsZu/DjUQLPvn8XYHgvOrtZDNURai+ixduWiCKvp5T649vs61ysR/kCA==","signatures":[{"sig":"MEYCIQDinfBps4NQFP7UHqo3mdBYt8uUC/V40b3FgQYEJF5fNAIhALmdAWgxYrBK9rqogMaJcWfNJT1HY/qgAIJnSHUjdErM","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":114622},"type":"module","engines":{"node":">=18"},"gitHead":"c97b66a230b09104dcda36516c67156b128fe8b4","scripts":{"test":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.6","express":"4.21.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.3.0_1781217792712_0.40117483510498464","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"sparda-mcp","version":"0.4.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.4.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"bin":{"sparda":"src/index.js"},"dist":{"shasum":"b1d7fba3ac829516664c405da70463a7d5158106","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.4.0.tgz","fileCount":25,"integrity":"sha512-UgONSWw53BDOB4dh8H6puUIan+dt/Kv68dnWFBFDSABBLMirDjopAN5bAKPtn2jO/4qXwwALSfPAaqYi/nrUhw==","signatures":[{"sig":"MEUCIQD4M+PK3fI/+AY2cQEV/cF+fwMpB7D7eZZmz38gc++N+wIgAIrOIq2kFQjidfLUx3P9OHqRjascS9UJOExQJqt2jPk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148333},"type":"module","engines":{"node":">=18"},"gitHead":"08f904d603d3d5b0d24ce3ab5573036c70d22f9b","scripts":{"test":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.6","express":"4.21.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.4.0_1781287382051_0.23843228390706672","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"sparda-mcp","version":"0.5.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.5.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"bin":{"sparda":"src/index.js"},"dist":{"shasum":"46b7be9730535a2db43f69a4a262e26a943974a8","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.5.0.tgz","fileCount":25,"integrity":"sha512-eH6aVDv3OJJMzO5jcwO4gceBGXENLO69naN/Dp6YTVb8TtuA0lwGC7iN+lQAA/NIgN2tniaCfqM0NHLYA6kyXw==","signatures":[{"sig":"MEUCIQDIZvj5TJVCEVorKWRfjdZJAzsyalbHs9aPl5ySuD9RnwIgC3PYvJA8zsSFblUs3RpAvbJaN16NczBNGYE/cb6N1u0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":167076},"type":"module","engines":{"node":">=18"},"gitHead":"8494d7cb570343d367d535942a0453b4485cb077","scripts":{"test":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.6","express":"4.21.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.5.0_1781297601153_0.5469054222983052","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"sparda-mcp","version":"0.5.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.5.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"bin":{"sparda":"src/index.js"},"dist":{"shasum":"4db09dde700f7d1f34c2d5bfbcd0b2929c86e8f1","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.5.1.tgz","fileCount":25,"integrity":"sha512-BR+1Cese/G7JYswDhQW5lnfE6lJU+l0bqrrcdP5fTI9grIreGzulPx4rDLzbJRGKNi5nbPmFJPAA2d7ninFGQQ==","signatures":[{"sig":"MEUCIExDANN+3UEkdGEIcwB1BATVZX7fJc6xz74oRHuZ9AoKAiEA2HzNQWVuYL8xiUL+wbGCsEdpxGEtw3+Li9p6I5bepD4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":174271},"type":"module","engines":{"node":">=18"},"gitHead":"0efe77fac013491a0f65a06c0bcc8d24098075db","scripts":{"test":"vitest run","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.6","express":"^4.21.0"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.5.1_1781368772983_0.9387463692824358","host":"s3://npm-registry-packages-npm-production"}},"0.5.2":{"name":"sparda-mcp","version":"0.5.2","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.5.2","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"bin":{"sparda":"src/index.js"},"dist":{"shasum":"a50014e682c6976efc6a66825d146eebdb08760f","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.5.2.tgz","fileCount":35,"integrity":"sha512-Z+TsJvyWBdtkQhn5/Vg0aDwMODHnXzzduyTS4j2zmc0+za73xNYqyLH1V9gYvUKiitOq6lcBc5Hp6TbC5OKH4A==","signatures":[{"sig":"MEYCIQC9EeVWO1J414JBkCpk0erpSkmxU1Hh5epxUD3DRaKJgAIhAPTRsl1cbyBAMAfLROKLf/wuAQP2av+x9IoM1SP5A2iy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288548},"type":"module","engines":{"node":">=18"},"gitHead":"2cc1439b98416dc83d0d845f6b9415612ee8d573","scripts":{"test":"vitest run","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.6","express":"^4.21.0"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.5.2_1781558425687_0.5366747299949683","host":"s3://npm-registry-packages-npm-production"}},"0.5.3":{"name":"sparda-mcp","version":"0.5.3","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.5.3","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"2149165b6eb029074bfe3c62a72a33e1fdaee1c7","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.5.3.tgz","fileCount":35,"integrity":"sha512-KGmzLkbqixBZo9GqX9EcgV4vTzcZhu1DXLtoOJy9xt/LclCthMKhE8SchAmieg2yV6g3z8BqxHFIwrMAMqqv8A==","signatures":[{"sig":"MEUCIQCyMBMm1JQCXgt0LIqVauay3hJLuKyPiglutnpkgmhvCgIgNqNu+K/tOhUHenGKPkUSplhGfk50S/4aYFhfdXt3Bzs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":288777},"type":"module","engines":{"node":">=18"},"gitHead":"0bcee880a51059487070d083a4909d3e9fed340a","scripts":{"test":"vitest run","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^3.2.6","express":"^4.21.0"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.5.3_1781563372076_0.23575130463779215","host":"s3://npm-registry-packages-npm-production"}},"0.5.4":{"name":"sparda-mcp","version":"0.5.4","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.5.4","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"7fd784a5146bd3291c0087f7d88a3ca1b2484866","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.5.4.tgz","fileCount":41,"integrity":"sha512-LMF3fTZWpdbiy5U3WUclqweaELKVKToAqxutEXrfUoLTliNlCprpsDQswIaWWw8Se8xZZ+8phUk0KGUEY8zJsw==","signatures":[{"sig":"MEUCIBvwWb4e9YwGn3A8qDNUITNOxH1nW7iwo9M2gR0EiwF9AiEAtYphy8Z38NwZy8AdtxVaQLR20jexhYxpEv2h+//Xk9s=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":332244},"type":"module","engines":{"node":">=18"},"gitHead":"045109d08049186e085d78bb30e10ee7c7b89c2d","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.5.4_1783023303930_0.7528274888287763","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"sparda-mcp","version":"0.6.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.6.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"145367e6b491e252a315681f4148cc443b6b8d3d","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.6.0.tgz","fileCount":44,"integrity":"sha512-OuyYkNX3ZncYiKLFimfhHkxDlHbGx4G/Zz3lXFN4SIHj/jiMR4Ax4mGqTtl6xmWTlleIIG0k2ku5vl0NcHTpqg==","signatures":[{"sig":"MEUCIBLh5wCm9QD1iXxRodyxuU49yd80yXy0dGxx0eVHwBo0AiEAr9/pKjElHDHMAf2OqYzECWm6RLnrRuvKP47TvD1mTkE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":368218},"type":"module","engines":{"node":">=18"},"gitHead":"497b856ecca9a4558c529db11aebdde57c949d7b","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.6.0_1783104727075_0.13747201353170402","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"sparda-mcp","version":"0.7.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.7.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"369fc3aeca15130d6b05079143ce5711ba3de079","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.7.0.tgz","fileCount":46,"integrity":"sha512-hMklFfCun3VN4pwRh0xTeA3Am03sZQ6tqVXWMmr3DcLI9N0YKse0YwgNG3pkMrEKaNszsNC3PSFYKeoNDql6IQ==","signatures":[{"sig":"MEYCIQCCf4frsjLNe654rktesKfRdNuhA0UI7G+VTG/ccvW62QIhALFWbYmss/2OsKNnajDXVwZNWVO9mPDGDi+DlaOsvdWp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":389878},"type":"module","engines":{"node":">=18"},"gitHead":"6c614bb908ec459ef5c2f94c2323e353993e4ba4","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.7.0_1783118719873_0.9198599925237718","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"sparda-mcp","version":"0.7.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.7.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"1cbc4c82d195a955affd454e5c1266b924530c81","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.7.1.tgz","fileCount":46,"integrity":"sha512-GqA/ZymEe7PatXu2koaAaXINKIC2Xb0ZvGtK3kuSUSwABjKytonsPhaPNJ1WjYGBWE1KbSDxN4RfzwZEKeTk2g==","signatures":[{"sig":"MEUCIALmVo/3gJZVzOl2TEfFxmBaQdGHbipoWiFCQbANP9H7AiEA0SPbe/F9mPCz4rM9aXWXWIS4AcJ7xsRhcYiTFBp2s7k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":396118},"type":"module","engines":{"node":">=18"},"gitHead":"c9340803fa791805d28b4fa81b5a229d597c8561","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.7.1_1783139335799_0.034666156915088786","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"sparda-mcp","version":"0.8.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.8.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"c3f0a28fa926f9241a3b3a91df610ff7fa91b543","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.8.0.tgz","fileCount":49,"integrity":"sha512-VUL0k0mpn5ffcizuY+Dqfbm7DOsnRS0HY+3uRdypcd7sLEAoNeMaM+tClRDNkPer+lnxHpohDe9vRV+57Ve69A==","signatures":[{"sig":"MEQCIFnm5eKn4+laX40h/aT6dRCDpv2gxjQLLSIN7XL5ShnfAiBsFXtdjhalJ7IPqfk8XR5brWIdtyri31vaAexrXxD3Yw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":417581},"type":"module","engines":{"node":">=18"},"gitHead":"7d34441da64b5515c5dcf0191a2249753875eb6f","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.8.0_1783175035032_0.0941936977797373","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"sparda-mcp","version":"0.8.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.8.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"78a3c06af095fa922e6dfe547437757bf77bba7c","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.8.1.tgz","fileCount":49,"integrity":"sha512-Lj864KkfUZqWNPFnNRRUAFI0T6roA6xCO7pnGvQV0p+mrgrLOWF63JRFuURcvepvGvQnW2/USJM2mNyZh7d2bw==","signatures":[{"sig":"MEUCIQC83E3JyEy9/rvLuFEoUvqQJco7GUoItTWtuqdC1vvPiQIgfOAs4AXzl4jnLNnBrxZLnaBfHyY2zGMZ26+luTkoCFY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":425219},"type":"module","engines":{"node":">=18"},"gitHead":"257ba7759c83d2aa19b2373aa38d09fbd54b738e","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.8.1_1783217761571_0.8830752036515799","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"sparda-mcp","version":"0.9.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.9.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"e47f454953773758dbbb3c62513e6b4cbaa4f89d","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.9.0.tgz","fileCount":67,"integrity":"sha512-X3RWlAz0zxdJAWt9FNdGeYJMeC9IJd+YHITOB79QkDKwkv2DnaaPwM71vq/y2N5notESAdXfq5Kw7zfQXrKjmA==","signatures":[{"sig":"MEQCIFwKbjV+nIXi4MhbMvTfgXL3/NjtM6VQS2/LuGRU/iNSAiAIkJfTIoxjkOpXIsYLNvHzjveF9p+oyX8qLR+HJbrWNA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":543316},"type":"module","engines":{"node":">=18"},"gitHead":"b1037631f5513bd89134d4e140f811f4c9176a01","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.9.0_1783247783575_0.6530691509130864","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"sparda-mcp","version":"0.10.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.10.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"e426917bf2f7bb112fb5daf7e6381249570fc89e","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.10.1.tgz","fileCount":75,"integrity":"sha512-5ZHvkWCa+qsayXkA5z2z2yPd9H7eJxGBDJ6fH1vjh45bgIPGPqo10KbKtjd25kVPKMxMQNi3wzu1a5bBLJ9OAQ==","signatures":[{"sig":"MEYCIQD5c/Awli6ynxBicwisMA1hrUqogUJLUrIydB/xZdyG0AIhAN5fPW9M51D8G5Olv+c8rU6vdhxuAeoP/xEMGtjQnkxg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":583864},"type":"module","engines":{"node":">=18"},"gitHead":"c0fb03f8b69690bbc5cea1b48c81c061bb83769a","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.10.1_1783282799984_0.5034142109450186","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"sparda-mcp","version":"0.12.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.12.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"af42a8086636dbdb7284855e8d474bebf8984d31","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.12.0.tgz","fileCount":84,"integrity":"sha512-pYk6CYu5xboSAsIMLcnIxCinlbvkMrPaEu3jDhb6eJR0ouD8FIVr04/rAOvN+G4orhe1lKpj7sJFFvH87Cu0XA==","signatures":[{"sig":"MEQCIC8iSfC3NNvZAK1lI0Vr93H4reR7gN1R4yHlXLWThFYxAiByWF0VYiIJCsJnPpcJUSjuWuYRCpcLqGPxNAlaQ5Ff+w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":635140},"type":"module","engines":{"node":">=18"},"gitHead":"021d77b20d72f8c698683566d9eb771b53bcd71a","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Turn any codebase into an MCP server with one command. Express & FastAPI → Claude-ready in 3 minutes.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.12.0_1783305425826_0.45521105485420854","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"sparda-mcp","version":"0.13.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.13.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"b214150864c9cd9c9688243dc564637c72799ddf","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.13.0.tgz","fileCount":86,"integrity":"sha512-LlPXhP8wB06kJyIAeBUx/gKtkXzOjonCU8X+I7gwBeVN+dMBpMLtibkgq5fHPMw071tREa2Io+uqs2DJvRZwZg==","signatures":[{"sig":"MEYCIQCLgUQ3khqX+1DJ5lll95ctR4h7NSVCUmUyxhwBOcbUpAIhANph1KkW+aaqLe61E+YMuG/aBKC6fnXJsqyBzriTIfJG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652122},"type":"module","engines":{"node":">=18"},"gitHead":"3cab24274e943aa69599216a3e78b436494fad97","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile any backend into a deterministic behavior graph (SBG). Statically prove security, simulate APIs without code, and replay bugs locally.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.13.0_1783328004689_0.7121300200460086","host":"s3://npm-registry-packages-npm-production"}},"0.13.1":{"name":"sparda-mcp","version":"0.13.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.13.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"1feaa06f16d9d7c572872eedaa2b63a6e8401b93","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.13.1.tgz","fileCount":86,"integrity":"sha512-Vlc3tTGEN0btOdTsM5T2gUopPxTd4ClchQbv9hG2Ae2KiWDCrsqA36OdqCFE3rBRVqQNp7m7oN/4uHgQ9uOUMA==","signatures":[{"sig":"MEUCIGP192wyc5RRZA6jYwPv3TT9Z1vZkC2I0bSOgXVmNneaAiEAw3QafCzEVpvwIr/rWU6atpinKwg+lZD93xvfJPJvmXk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652075},"type":"module","engines":{"node":">=18"},"gitHead":"040793fe24d9b929a9b78474dd60840a6a9617ac","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.13.1_1783328223437_0.7265655988020525","host":"s3://npm-registry-packages-npm-production"}},"0.13.2":{"name":"sparda-mcp","version":"0.13.2","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.13.2","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"ba62e57f3bc87accc73af35262ab1f93219d3758","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.13.2.tgz","fileCount":86,"integrity":"sha512-ciecpURUi3jnXm8shjvmIGlAQCcEuxhLmbVW6K87G95wdoOrDsl3DMIbi7jfyPpYhlvwCYXyq7i80Ea8MIsktA==","signatures":[{"sig":"MEUCIQCu4I2fF9FMn7PaFC5+05baKB0ZHGc8iHS3AWhTOHKTLwIgHFzGJLNGTkGctHxCdsJGsoaarVNlLbvsBAGY5MIN7+Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":656271},"type":"module","engines":{"node":">=18"},"gitHead":"9a7acb67f403dc93a6bf9072c5f7562110643ef0","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.13.2_1783402831653_0.16305566320792697","host":"s3://npm-registry-packages-npm-production"}},"0.13.3":{"name":"sparda-mcp","version":"0.13.3","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.13.3","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"16eadd76f04a8a6ef32b2227770ea9659189b127","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.13.3.tgz","fileCount":86,"integrity":"sha512-qSR2/jzzTU7G8pc0T0bEU2MnVqgivMYhTCO2ts87N/rQg5m7rJCVWMlD9bBSI3iU3hGWhO9ZosOu7jhl+816zA==","signatures":[{"sig":"MEUCIQDXFGsXmdoklSDQurf7Ryy8U79qR6SmKQ1RnW3WXKrhLwIgCSBxDvrFaummu0nK81Mfc/mww2zvptnf4gSnabFBOdg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":656611},"type":"module","engines":{"node":">=18"},"gitHead":"8badd44e37030a90e02a16e247eb50688dc787d4","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.13.3_1783443055723_0.07741929676434678","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"sparda-mcp","version":"0.14.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.14.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"bb224f32ede1bda851331bf0410a6a808ddeadd1","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.14.0.tgz","fileCount":89,"integrity":"sha512-Su8LPIAfzM7maBzHtah8k3kHEghRyGv7Frjv/XOSVHSUh2c8m/57Pdc5XrDIdlGBcfSvS7vvT8BmQFZC9DvrWw==","signatures":[{"sig":"MEYCIQCNvvpgFagqS2un6Au3c6g6UeS95S9Un/ej8x6qCC0EoQIhANWSWnUt6H5LhJh8KWC7/ZC87Bx0LqcI6Ewhzz4n4tHD","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":679282},"type":"module","engines":{"node":">=18"},"gitHead":"7bcf1e2f29971a8164303e02cca86cc214793a29","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.14.0_1783748488293_0.2160824863597297","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"sparda-mcp","version":"0.14.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.14.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"3117b478884a6be8077b496908890db41bb18b85","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.14.1.tgz","fileCount":89,"integrity":"sha512-tZnRyO9OPIpvBBDl5u9AclSgJhyI0TZR9QM87Na7h2UI2E7TCR1n2/X1AIZxugLKbJlIW0UaL7iY57mT+y4OcQ==","signatures":[{"sig":"MEUCIDBdD6iEqa8xw+WIJzylv0+Dd9ryrW5067XXtSolaZc/AiEA0Z4JMPnB0PvPFYWejpb3Q+9768gVlJgMqHenGgCLj0M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":682941},"type":"module","engines":{"node":">=18"},"gitHead":"4cd8714b5c7a744cbcb32b921dfe219511f1d35e","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.14.1_1783798194812_0.43066675965869794","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"sparda-mcp","version":"0.15.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.15.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"b9a7e5c75afb3af58d1dc32804891d80f4e07663","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.15.0.tgz","fileCount":95,"integrity":"sha512-oweevsVkXhWV8l4IUrd/dR5I8zagSGbbo2TqMunPEZ4i2MYbZ9rnEpOq9nPaLkctDdQnvIPsgG9GCQivgJ316g==","signatures":[{"sig":"MEUCIQDvIDlTU+0fHSUQYJgaUTSzhCkkFiGuRnzmAykXV5A7pQIgRwEzfw8+mAVOhxqZnNnEN+M/4hrY5NI4Y+Qpt9PKAMI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":712065},"type":"module","engines":{"node":">=18"},"gitHead":"fb64a201abb66c721c98eb027b120e03aec95a7d","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.15.0_1783835364583_0.34762826848683037","host":"s3://npm-registry-packages-npm-production"}},"0.15.1":{"name":"sparda-mcp","version":"0.15.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.15.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"bbee7069d4966de7fca52ff210063b178fdca36d","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.15.1.tgz","fileCount":96,"integrity":"sha512-YooBJfD54QMy24G76enEHb4xPIsirnhvFE0HV5wkmEmCXjQpDmA5G+YO6BKxA1WIYU949yNjf+1mcpvVzILFbQ==","signatures":[{"sig":"MEUCIAztfvGZm8sD7wvf92IEFhhiDLHN0p4izq5mUH8ykxU1AiEA0pfJyOMxbrQ32GLhzmAZ8RNI9OvdZsFf+53+xJAVWsA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":712871},"type":"module","engines":{"node":">=18"},"gitHead":"c1fcaabaf5007c510ba83453d9d6ea15242ae03d","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.15.1_1783836329908_0.2888147306980742","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"sparda-mcp","version":"0.17.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.17.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"d9a27e2089bf1e0785b48752db2d144c6a51127d","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.17.0.tgz","fileCount":99,"integrity":"sha512-eifzttFq95J/fag12iKTYQc9aFbyuycHAtROScRDgatgylQIu2t1Er3rg4R+/JW6ayxxxIyYltVTSby/Khq74w==","signatures":[{"sig":"MEQCIAEvQowbIOEvP72GVapiHkL66H1uWnAecm/ftJWqSEQ8AiA/E1lcc1lrk/rJOtHgixDdRp3bYi6kAMQs7cAFCK/cEA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":731222},"type":"module","engines":{"node":">=18"},"gitHead":"ae35aa46aa04a8469c81efcec802958830e8adde","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.17.0_1783872769442_0.31254711493917386","host":"s3://npm-registry-packages-npm-production"}},"0.17.1":{"name":"sparda-mcp","version":"0.17.1","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.17.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"6ba4df67e3cde397f646b1528fab5abb13fbffd3","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.17.1.tgz","fileCount":99,"integrity":"sha512-NQa4KfKBy/lXIIW+dJweTvsKUFefHePxuUHSiapbrzRzpHEH8sl1vDwmEd/EzTfOM4DtAzE199k90LOAhMB8WQ==","signatures":[{"sig":"MEUCIQCvDgr7en2Nwm6eHtq2sX6WNTtulp4Y0lRXQ9PmLnmB1gIgfkG6N8KJWmQr/UUOQv+mLASdB3a2iLeeDav+tHIzpWI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":731222},"type":"module","engines":{"node":">=18"},"gitHead":"ae35aa46aa04a8469c81efcec802958830e8adde","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.17.1_1783873133301_0.6527244438088617","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"sparda-mcp","version":"0.26.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.26.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"a2fcda2584f41f03fb55789d876583aa3b97269f","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.26.0.tgz","fileCount":103,"integrity":"sha512-1xVthV9krwSlON6pFGINAJ5ZJ8nUYNhbzhzmC2hMOs1laDpb1fHkNiL6qWOSJkcewUaYqlB7t8AQhE1cS9YNSQ==","signatures":[{"sig":"MEYCIQD0M9tjB2rPoQTg9fD0TzUmENZp8cbZppufB7fBFsNv/AIhAOJ1D8GDvEZqpyZXPcvul1VAjWlO8EzGB2DGv6NIw9bw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":800742},"type":"module","engines":{"node":">=18"},"gitHead":"6a4838c5bf9932638d14f0f838c9de00f70b72bc","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.26.0_1783919553094_0.7652970600564615","host":"s3://npm-registry-packages-npm-production"}},"0.30.0":{"name":"sparda-mcp","version":"0.30.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.30.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"765093c2684d9e755fe6ac910b13f94f0bec8c81","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.30.0.tgz","fileCount":104,"integrity":"sha512-eQYHOCTn/V1+SZc4kMJqi/TVK+6ogRpmtlAndP34x9VVPphzMtpEN2UY7heM6LiUpXHR0jWZa9SpoIP8BdtR3Q==","signatures":[{"sig":"MEQCIEhMvQmEHHolJ2CTepIl7BAWJj1KnlaLzvmCnTOR7jL0AiBO0yYvRk4qarYhir5j1ErWStCU5NLPbbXp0JYjeiD39A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":825958},"type":"module","engines":{"node":">=18"},"gitHead":"e8629046b3769468b5f29b82ab304c598ae0bb1e","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.30.0_1783976261204_0.7369672098905351","host":"s3://npm-registry-packages-npm-production"}},"0.32.0":{"name":"sparda-mcp","version":"0.32.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.32.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"4f7ff2874220b81b2ec5aca6da947c8f0d8e9287","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.32.0.tgz","fileCount":104,"integrity":"sha512-dyLsMF0bbCed4AYt5rml3VxFNXchws7OgXlisPaj2rrhafU+CDYzAIaHOOUvMkv3/zNcD2RWeS3tzacZYSW0pA==","signatures":[{"sig":"MEUCIQC2z+PCIRX98nbLJKMsmKVukvyMTdRIxaP3pfVQKjwmiwIgeX6iS5wSg6CQQs07dzp6J8SAEg/z0BbSSCqVrUgc2dI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":825958},"type":"module","engines":{"node":">=18"},"gitHead":"5c8b5c9fc18571433618724bf36bab18d5bea9f3","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\""},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.32.0_1784009902291_0.5920170568192085","host":"s3://npm-registry-packages-npm-production"}},"0.58.0":{"name":"sparda-mcp","version":"0.58.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.58.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"034f1ceb308626c660ace4d01992df5ea2f1d29d","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.58.0.tgz","fileCount":108,"integrity":"sha512-60jto6dqaiKw2rglDPfDdJeGMfp7bsBouqe/Jhgln/JxErhbVK+lgDrfx5uo0hRz2zDJdJ336JY0r0GDw4Q8QA==","signatures":[{"sig":"MEUCIG3k2twwekO9sLjej3gbz1iY9e5IWgSd+QD95SbduZnvAiEAhn27yAdpu3sXeBP6xo4IvqhQHmOxqVutSxtFWAbafQE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":933806},"type":"module","engines":{"node":">=18"},"gitHead":"c0e443cd92764d029eaa93e43b15ec4eccf8658d","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","test:all":"vitest run && node tests/router-selftest.cjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"js-tokens":"^10.0.0","@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.58.0_1784299510085_0.9684060326989414","host":"s3://npm-registry-packages-npm-production"}},"0.62.0":{"name":"sparda-mcp","version":"0.62.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.62.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"83ddf1d4a613f6d71f6c2f05ef86f8a54379d027","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.62.0.tgz","fileCount":111,"integrity":"sha512-gfpj9COJkyHtzYZ5qdVTH0uqrDaC+vVjPaomw6rXJQa9ziALuhAmK6Er+K0J7/0xVQSebBMFtC98oAoYeqT7gw==","signatures":[{"sig":"MEQCICsk32utX7KhPlHWnXBLxnW/W1+QzhyLo7jq7saGmdnHAiBXGRX8JldYIXclhoBXB59X0uHZRATbLF0aDrtxuKaOJg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":954899},"type":"module","engines":{"node":">=18"},"gitHead":"d28e919472857b16380fa67daf31379049662ab4","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.62.0_1784317931623_0.5808894970779934","host":"s3://npm-registry-packages-npm-production"}},"0.63.0":{"name":"sparda-mcp","version":"0.63.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.63.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"005b7062ebab9755e7edafcf239f32528f62313a","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.63.0.tgz","fileCount":111,"integrity":"sha512-BXkkHh1Q/teLU29xqV5GoBWN6uCklDzGx+ypkuSgJj7xakhxGfx0xRXBlvhjovtkfVt/5EEGJM/xdKnS7t7SvA==","signatures":[{"sig":"MEQCIEL/UsYJejWFStWlJfYjFDbaCxf4YBWL9xl9wKwJICaGAiAfGCKEQ8NyE2XvaUhXkmRfMF4Sk/9y0qhu6zTARUfRcw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":965316},"type":"module","engines":{"node":">=18"},"gitHead":"89b8708864358cfb0fdd8dd5395528c554d5f20e","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.63.0_1784329354371_0.5401534109606683","host":"s3://npm-registry-packages-npm-production"}},"0.64.0":{"name":"sparda-mcp","version":"0.64.0","keywords":["mcp","model-context-protocol","claude","ai","express","fastapi","codegen"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.64.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"b647ba9f821e1d04d24fe963ad34bfec139cccd1","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.64.0.tgz","fileCount":111,"integrity":"sha512-09Pps3P2njeWI3jaNFWId8UDz3Vh/s2fXK4Z3H9k5OgTQGIJB4/Pfi3g52YgQw5+qmdHOBYN3gNyZoN/LYgtuQ==","signatures":[{"sig":"MEQCIAhfw7X90fUcvoSFYhyzBSsOSiUWIL3KQKY5PrpBPGDXAiAp+2ToeGpq6yc6//qYpZq2C+CLDv8ZlnMvOP7jb7x1Mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":974815},"type":"module","engines":{"node":">=18"},"gitHead":"1f2c2d32ea7dff837c68c372d0314b03c6f090f1","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"Compile backends to behavior graphs. Statically prove security, simulate APIs, and replay bugs.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.64.0_1784382922100_0.3612613634790902","host":"s3://npm-registry-packages-npm-production"}},"0.66.0":{"name":"sparda-mcp","version":"0.66.0","keywords":["mcp","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.66.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"aa72f99835ec42ae25069419d49b72c17ed7d69f","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.66.0.tgz","fileCount":112,"integrity":"sha512-axdfsq64/U91fAd1BtB6Cwg6GiZetzIvVVxkwRISBb5KHJ+9OCx4+a1L5w6zU6Jllam0R850SdNbMJt2xEkw9A==","signatures":[{"sig":"MEUCIQCkWnOTykGhE9al+93pxLLuX/MucAi0k9NYr2Sdy7YrPgIgS9AS7zD45xyzR1vZuyA0uMFkPY46e05TfGBU0NRdTNU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1002931},"type":"module","engines":{"node":">=18"},"gitHead":"62810dd7330dbab8cd968395d8fee5c766307f62","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.66.0_1784498842152_0.7286927036235658","host":"s3://npm-registry-packages-npm-production"}},"0.66.1":{"name":"sparda-mcp","version":"0.66.1","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.66.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"8a89bb985b731bbabcf14e2450c417abd21b1971","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.66.1.tgz","fileCount":112,"integrity":"sha512-bRxl7G8SegdfsLsdanSEMkMfdXXLhBSqdIG/GKKjVN15A5L5hPm/Vw30n2S6b/NzPk28LsfruOTOXqSrR9JMFA==","signatures":[{"sig":"MEQCIFDLH1RlNNecKhns+P63PeWYn0eAB1CdCp0tmClsfjuHAiAdJZsq2UEvy93tsonE2Vm9JW0dk75GWYKaHdziqXaZOQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1038484},"type":"module","engines":{"node":">=18"},"gitHead":"0c18fd572348830a3f8bf720987bcb9f447ff733","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"7.26.5","@clack/prompts":"0.9.1","@babel/traverse":"7.26.5","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^9.39.4","vitest":"^3.2.6","express":"^4.21.0","globals":"^15.15.0","prettier":"^3.8.4","@eslint/js":"^9.39.4","@vitest/coverage-v8":"^3.2.6","eslint-config-prettier":"^9.1.2"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.66.1_1784578743007_0.1272076347201927","host":"s3://npm-registry-packages-npm-production"}},"0.66.2":{"name":"sparda-mcp","version":"0.66.2","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.66.2","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"a2d503ec7f6fb8d9c345bb8fffc0c3ffab42072a","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.66.2.tgz","fileCount":112,"integrity":"sha512-h8MR1URBFunwAUwYDp3CzilXxFLmQtxHVMgFVEq1Z8HKLUcT+lh19qaxLLawOKSC3bzxz2S49xR7tmoZTolUXg==","signatures":[{"sig":"MEUCIQCr5YbCr/2kudgnBWU2PwNAmk3cJrb86wxDvIjjoF+rRAIgIbJ1wbXt7fegodQjovojlaw+2vWbkrJVgBZvQYQVEac=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1038486},"type":"module","engines":{"node":">=18"},"gitHead":"0e36063c284f01578cb983d0bc727f29d5c30839","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@babel/parser":"^8.0.4","@clack/prompts":"^1.7.0","@babel/traverse":"^8.0.4","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.66.2_1784675281485_0.20731315840831144","host":"s3://npm-registry-packages-npm-production"}},"0.67.0":{"name":"sparda-mcp","version":"0.67.0","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.67.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"0ef969853177ac3c01b285de6bd28d9f1cecd8db","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.67.0.tgz","fileCount":112,"integrity":"sha512-gE9QZrOxh0+dOuPd7Z+eqfkHDkDpYXfnqYlLD0HOcuEdux8gTyu/bGZcG7dGStzrD7tfJhIjj9Y192O/KMDVJQ==","signatures":[{"sig":"MEYCIQD4fJbWYbyrFO9TOoQzyGC1p7fsjOkcO8Syv42VmCCOOwIhAIzoWjVwl+ngX+N42c4xti/sdhKDWIWLXMFRRE/OglNw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1059315},"type":"module","engines":{"node":">=18"},"gitHead":"910ce5960d0e2aa6f6a01ea2037203008d1c9d7b","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.5.1","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.6.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.67.0_1784728089234_0.2286075189781105","host":"s3://npm-registry-packages-npm-production"}},"0.68.0":{"name":"sparda-mcp","version":"0.68.0","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.68.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"b72f387367814e5b194e7c6c092bda67f9bc62ba","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.68.0.tgz","fileCount":114,"integrity":"sha512-QkaYU/rFZcDqMJ0ggvpZ+9MfSrZbOJmBKhygPJeL5fQqBzW9ETJ7JBdbaCbyhd3ytGLpcem0GYL0V5YUskCzPw==","signatures":[{"sig":"MEUCIBJTnbua/JxPtaFacPQZ728IykjODlqsFnZVNlz/nKm1AiEA0BiprfcZ6nUiIDaiQD/JCGeJ4pc8vh4qbZ18XDMeYfk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1123382},"type":"module","engines":{"node":">=18"},"gitHead":"76a335846aaf69852323e52cfe40737de583a132","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.68.0_1785019594278_0.5698862407594645","host":"s3://npm-registry-packages-npm-production"}},"0.69.0":{"name":"sparda-mcp","version":"0.69.0","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.69.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"d5671dbc56e2dc3da7bc6d2d2d2164ef9a73bb80","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.69.0.tgz","fileCount":120,"integrity":"sha512-Ax0HAqsOi5qPV9L6mI+4GcHaRJrTd65tFs9j/tKhMqgvbGJ7j2to/LkyT317yts8nG4YjqjpfGmxqHjW0NRtKA==","signatures":[{"sig":"MEUCIAjFHT5Qm2nWXb6pGwK+DIVXiKeSjyF1RIiR0CkfRZrTAiEA3ljc7RKQ4ex6uWrdpEEkGTcn7TVxoJnnt9M+6NITrl8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1272596},"type":"module","engines":{"node":">=18"},"gitHead":"239fec87249f5294c9980f70a2547e52043c1a89","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.69.0_1785166376307_0.0786928515348202","host":"s3://npm-registry-packages-npm-production"}},"0.69.1":{"name":"sparda-mcp","version":"0.69.1","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.69.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"f36207deabb2a1c6240688659a2c7c9840fd74f9","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.69.1.tgz","fileCount":120,"integrity":"sha512-2Ini0KhqTlGpw4I2wTAwKf4BMpJFdMSJ7tYopSpqC58Oag9c5+fb4KfUhGOCQgLdrMT4l7lKe/gI5PbhQ5XW4Q==","signatures":[{"sig":"MEYCIQCniBlVGJtzVn2tAEmaMIGCKbDEekcNqTEQcAdnW/zS4wIhAMlUUMaMIzZHJ/EGjn97eiK2PcHDLB3A1MHvTObRWmAy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1267817},"type":"module","engines":{"node":">=18"},"gitHead":"239fec87249f5294c9980f70a2547e52043c1a89","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","prepublishOnly":"vitest run"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.69.1_1785180475764_0.012275477552580627","host":"s3://npm-registry-packages-npm-production"}},"0.70.0":{"name":"sparda-mcp","version":"0.70.0","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.70.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"674fc0bb63b11e33f13a4399db8df767f8b84c32","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.70.0.tgz","fileCount":120,"integrity":"sha512-cRv79NbPVM2PplA/16ks6d0oZMdHSWOfePbeajMMzm/o3CFmC9r+mg448ncJtPhIcULpj3sZZlHzRzh1YG1bQw==","signatures":[{"sig":"MEUCIQDJYrd6LaKQlCkDSIG0/XygiJF3PTJc7TJFXxnrqK3RlwIgddOvpus6K42lAmgkLNHfqi3ArPsUPAkUFEektZn6dlo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1270188},"type":"module","engines":{"node":">=18"},"gitHead":"239fec87249f5294c9980f70a2547e52043c1a89","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.70.0_1785183327510_0.11775113910073376","host":"s3://npm-registry-packages-npm-production"}},"0.70.1":{"name":"sparda-mcp","version":"0.70.1","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.70.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"f70c2a0e6b6701f130a652d1fbcc7b9410362fc0","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.70.1.tgz","fileCount":120,"integrity":"sha512-Tw8sPt9SPcVVNLJ12yr6gLxB+Ba+4q81EFCqA1frev+lCJwdjH45BZjERlwqWu77D2wGk8iVMSLW3sQvp8GXMQ==","signatures":[{"sig":"MEUCIAt0QPRQgbDTCsZzuxFN5r0wqRy1qxDDUc919wx7I58FAiEAyylZBICmG4c+AIWu2l2sDU5ixsKuC8Sf4tDdcHTKr5E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1291855},"type":"module","engines":{"node":">=18"},"gitHead":"3dab1296cf50b37472a70c8cc43ce46350450d6c","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && vsce publish"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.70.1_1785215884100_0.879127851619256","host":"s3://npm-registry-packages-npm-production"}},"0.71.0":{"name":"sparda-mcp","version":"0.71.0","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.71.0","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"6954584a12c7448e5273c7d7e34c9267aeb82e96","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.71.0.tgz","fileCount":120,"integrity":"sha512-dB/dC04E0pPvHKlQqi1jo2ZU/WQpgjTMXrjAg6wOEO1ewqYrBIEAcABvRXy0eqUIgr8mbYrE3Kb0tIs7uThlYA==","signatures":[{"sig":"MEQCIBIlK8ThYyjHExbfb88K2SoY1YsdISX7n00ibT/h2sokAiBMZNNxBeCagWwrkcmXXu/GmwgoQ4fYf2S802WqNx0pAw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1308133},"type":"module","engines":{"node":">=18"},"gitHead":"0b5fd7ea12bbb06aebd14572500f22945532a269","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && vsce publish"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.71.0_1785281814010_0.9326230164221778","host":"s3://npm-registry-packages-npm-production"}},"0.71.1":{"name":"sparda-mcp","version":"0.71.1","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.71.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"53017f03752f2084000b14fb53501bd55534c530","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.71.1.tgz","fileCount":120,"integrity":"sha512-GesXyK4HQO/vqRniiWPQKPdALB6hmyWORqDz87g2PpHzDOrkCM2aP+RPwQO57HUCekbgfjfRABeumK5Sl+3CgA==","signatures":[{"sig":"MEUCIHNDeTnqvR5AcmOHiXIM4pvg+XzVeBLWx0GUpaOtNeIAAiEA7Q3hATaor0T+pnx7yisFvpwFMoKO0FQOPKXo03Kgs5w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1309138},"type":"module","engines":{"node":">=18"},"gitHead":"29d816939f606bb4f80643cf90f34428bf55abe9","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && npx --yes @vscode/vsce@3.9.2 publish"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.71.1_1785342700486_0.22186048148051252","host":"s3://npm-registry-packages-npm-production"}},"0.71.3":{"name":"sparda-mcp","version":"0.71.3","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.71.3","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zyx77550/sparda#readme","bugs":{"url":"https://github.com/zyx77550/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"33da1f220c16cd3ded6c8fc1a14251fe6d4b82c9","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.71.3.tgz","fileCount":120,"integrity":"sha512-WbyCwtB/zsCD8Bv9Nof4KXZHKvTbWKnXAk6QjJiu5W+zwwYTDoN2mWX0BrC+uyAoLAXU1RDAnCm4I/SulA8nOQ==","signatures":[{"sig":"MEUCIGNhkMlZ2wWsCjvj/6o04Od1WXSSgaTjhMjKLBOmgSp0AiEAtlHMeDQQxyeESfJp2CguO/L+vFiJu+MPvRB6wcLiOvU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1319993},"type":"module","engines":{"node":">=18"},"gitHead":"67657ced2732c68ad207088e42e5ec3b813f3cad","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && npx --yes @vscode/vsce@3.9.2 publish"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zyx77550/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.71.3_1785389466717_0.8931809161392998","host":"s3://npm-registry-packages-npm-production"}},"0.71.4":{"name":"sparda-mcp","version":"0.71.4","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.71.4","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zakariagharzouli/sparda#readme","bugs":{"url":"https://github.com/zakariagharzouli/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"9133fe60bd30fd94e71dca2967177dd770d61a8d","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.71.4.tgz","fileCount":120,"integrity":"sha512-QsKC411r2FeebCk6BpzFd/DxC+py/7iQyKZhAsXl4po2yDssHsuM0uKHLeCmJaQdW4O0NCe1rPZwTqNh9jlFyA==","signatures":[{"sig":"MEUCIQCG/V1xkNfWtRaG6CAZeWRxexyXrL/upKE1iDVcVSFNBgIgURGLs+SZyeV1oriDLF5zDLbYlPSZ6NVoAF4ISIbjhRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1320105},"type":"module","engines":{"node":">=18"},"gitHead":"b5e3f3bfcb87b3d3602d3ec854c871cfd626085e","mcpName":"io.github.zakariagharzouli/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && npx --yes @vscode/vsce@3.9.2 publish"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zakariagharzouli/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.71.4_1788300902987_0.5302267952572395","host":"s3://npm-registry-packages-npm-production"}},"0.71.5":{"name":"sparda-mcp","version":"0.71.5","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.71.5","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zakariagharzouli/sparda#readme","bugs":{"url":"https://github.com/zakariagharzouli/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"67c157205d02a5857566cf7cc6c27b00c9355f1a","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.71.5.tgz","fileCount":120,"integrity":"sha512-Xrdj/9JLJCq6iN9OQHnleHl2mE26V0kQSWM2IJrz/IcHOanikTBXRl7LLOnV7b0V5XlS44zA4FqdSlzmlXLKBA==","signatures":[{"sig":"MEUCIHPkuqMs5oZkEJ2/bHA9RJwkJiWvPyw6PRKedlSWued2AiEAq6K2pkTd+KSneohgKwaLEDlOXjo1jf+p0ZWjLxV5AJc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1319991},"type":"module","engines":{"node":">=18"},"gitHead":"e14bf12918e4d26f6cace01a2e60565075e2e148","mcpName":"io.github.zakariagharzouli/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && npx --yes @vscode/vsce@3.9.2 publish"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zakariagharzouli/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.71.5_1788341066345_0.7223453528557335","host":"s3://npm-registry-packages-npm-production"}},"0.72.1":{"name":"sparda-mcp","version":"0.72.1","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"url":"residual-labs.fr","name":"Residual Labs"},"license":"BUSL-1.1","_id":"sparda-mcp@0.72.1","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"homepage":"https://github.com/zakariagharzouli/sparda#readme","bugs":{"url":"https://github.com/zakariagharzouli/sparda/issues"},"bin":{"sparda":"src/index.js"},"dist":{"shasum":"9c9a871a8350b44bbad2769563bedbd80792a887","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.72.1.tgz","fileCount":133,"integrity":"sha512-IAnaxACBpLwNzInwDAnHvjCpXewmTZeq9aC3BS2E2RrHO9YV0U+5m17aL4RbhlU/MGCywVJJQ2ov54vxwW74Zg==","signatures":[{"sig":"MEYCIQD2XOtZ2QEmrYOCfVF5B7Zc0+eFGLGngrqUzrF/8tPRSwIhANvS7IV6ipj4kQQ9VNFk44g1sfAHaJlglwKCNm9HPtEn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1687173},"type":"module","engines":{"node":">=18"},"gitHead":"708015085dccfdc3ad5838c94a6fed0b821123bf","mcpName":"io.github.zyx77550/sparda-mcp","scripts":{"lint":"eslint .","test":"vitest run","wedge":"node bench/wedge.mjs","corpus":"node scripts/corpus-oracle.mjs","format":"prettier --write \"**/*.{js,cjs,mjs}\"","coverage":"vitest run --coverage","lint:fix":"eslint . --fix","mutation":"node tests/mutation/run.mjs","test:all":"vitest run && node tests/router-selftest.cjs","bench:pde":"node bench/pde-ternary.mjs","bench:check":"node bench/check-readme.mjs","test:router":"node tests/router-selftest.cjs","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","corpus:update":"node scripts/corpus-oracle.mjs --update","release:check":"node scripts/release-gate.mjs","prepublishOnly":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && npx --yes @vscode/vsce@3.9.2 publish","bench:soundness":"node bench/soundness/run.mjs"},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"repository":{"url":"git+https://github.com/zakariagharzouli/sparda.git","type":"git"},"_npmVersion":"11.16.0","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"@babel/parser":"8.0.4","@clack/prompts":"1.7.0","@babel/traverse":"8.0.4","@modelcontextprotocol/sdk":"1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.7.0","vitest":"^4.1.10","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/sparda-mcp_0.72.1_1788574317328_0.9042589070261509","host":"s3://npm-registry-packages-npm-production"}},"0.73.0":{"name":"sparda-mcp","version":"0.73.0","mcpName":"io.github.zyx77550/sparda-mcp","description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","type":"module","repository":{"type":"git","url":"git+https://github.com/zakariagharzouli/sparda.git"},"homepage":"https://github.com/zakariagharzouli/sparda#readme","bugs":{"url":"https://github.com/zakariagharzouli/sparda/issues"},"bin":{"sparda":"src/index.js"},"scripts":{"test":"vitest run","prepublishOnly":"node scripts/release-gate.mjs","corpus":"node scripts/corpus-oracle.mjs","corpus:update":"node scripts/corpus-oracle.mjs --update","test:router":"node tests/router-selftest.cjs","test:all":"vitest run && node tests/router-selftest.cjs","coverage":"vitest run --coverage","lint":"eslint .","lint:fix":"eslint . --fix","format":"prettier --write \"**/*.{js,cjs,mjs}\"","format:check":"prettier --check \"**/*.{js,cjs,mjs}\"","bench:check":"node bench/check-readme.mjs","bench:pde":"node bench/pde-ternary.mjs","bench:soundness":"node bench/soundness/run.mjs","mutation":"node tests/mutation/run.mjs","wedge":"node bench/wedge.mjs","release:check":"node scripts/release-gate.mjs","publish:vscode":"cd extensions/vscode && npx --yes @vscode/vsce@3.9.2 publish"},"engines":{"node":">=18"},"keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"author":{"name":"Residual Labs","url":"residual-labs.fr"},"license":"BUSL-1.1","dependencies":{"@babel/parser":"8.0.4","@babel/traverse":"8.0.4","@clack/prompts":"1.7.0","@modelcontextprotocol/sdk":"1.29.0"},"devDependencies":{"@eslint/js":"^10.0.1","@vitest/coverage-v8":"^4.1.10","eslint":"^10.7.0","eslint-config-prettier":"^10.1.8","express":"^5.2.1","globals":"^17.7.0","prettier":"^3.8.4","tree-sitter-python":"0.25.0","vitest":"^4.1.10","web-tree-sitter":"0.27.0"},"gitHead":"439617e44c22c6bd625a507e19c3deb1f75dbb92","_id":"sparda-mcp@0.73.0","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-TxEdSTV4nyJwidgTqUuvvoRiiXwDsXYbAkd203sM67eIj/1OdMh50S/zO2EdXW4mitS8X02Y/B0ZNkDsyxMpLg==","shasum":"2ffc8ee9d277374136bfa1a41de7a4b608844c16","tarball":"https://registry.npmjs.org/sparda-mcp/-/sparda-mcp-0.73.0.tgz","fileCount":149,"unpackedSize":1774071,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIClKLT5zcjwkactWnpLpvWDvgIbwWKWgGYGDQhIrJDdmAiAgQ4ld+edF/fLHphpGjEDyKIz/a2fC6AsbtsCIpVmrKQ=="}]},"_npmUser":{"name":"residual-labs","email":"zakaria@residual-labs.fr"},"directories":{},"maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sparda-mcp_0.73.0_1789064506662_0.6189349827226738"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-11T00:06:12.451Z","modified":"2026-09-10T18:21:47.043Z","0.1.0":"2026-06-11T00:06:12.642Z","0.3.0":"2026-06-11T22:43:12.848Z","0.4.0":"2026-06-12T18:03:02.207Z","0.5.0":"2026-06-12T20:53:21.362Z","0.5.1":"2026-06-13T16:39:33.120Z","0.5.2":"2026-06-15T21:20:25.811Z","0.5.3":"2026-06-15T22:42:52.211Z","0.5.4":"2026-07-02T20:15:04.121Z","0.6.0":"2026-07-03T18:52:07.225Z","0.7.0":"2026-07-03T22:45:20.021Z","0.7.1":"2026-07-04T04:28:55.944Z","0.8.0":"2026-07-04T14:23:55.231Z","0.8.1":"2026-07-05T02:16:01.726Z","0.9.0":"2026-07-05T10:36:23.736Z","0.10.1":"2026-07-05T20:20:00.151Z","0.12.0":"2026-07-06T02:37:05.992Z","0.13.0":"2026-07-06T08:53:24.827Z","0.13.1":"2026-07-06T08:57:03.604Z","0.13.2":"2026-07-07T05:40:31.783Z","0.13.3":"2026-07-07T16:50:55.916Z","0.14.0":"2026-07-11T05:41:29.465Z","0.14.1":"2026-07-11T19:29:55.001Z","0.15.0":"2026-07-12T05:49:24.745Z","0.15.1":"2026-07-12T06:05:30.077Z","0.17.0":"2026-07-12T16:12:49.615Z","0.17.1":"2026-07-12T16:18:53.462Z","0.26.0":"2026-07-13T05:12:33.222Z","0.30.0":"2026-07-13T20:57:41.368Z","0.32.0":"2026-07-14T06:18:22.617Z","0.58.0":"2026-07-17T14:45:10.298Z","0.62.0":"2026-07-17T19:52:11.892Z","0.63.0":"2026-07-17T23:02:34.526Z","0.64.0":"2026-07-18T13:55:22.280Z","0.66.0":"2026-07-19T22:07:22.349Z","0.66.1":"2026-07-20T20:19:03.194Z","0.66.2":"2026-07-21T23:08:01.724Z","0.67.0":"2026-07-22T13:48:09.473Z","0.68.0":"2026-07-25T22:46:34.440Z","0.69.0":"2026-07-27T15:32:56.493Z","0.69.1":"2026-07-27T19:27:55.927Z","0.70.0":"2026-07-27T20:15:27.723Z","0.70.1":"2026-07-28T05:18:04.282Z","0.71.0":"2026-07-28T23:36:54.196Z","0.71.1":"2026-07-29T16:31:40.658Z","0.71.3":"2026-07-30T05:31:06.892Z","0.71.4":"2026-09-01T22:15:03.113Z","0.71.5":"2026-09-02T09:24:26.533Z","0.72.1":"2026-09-05T02:11:57.512Z","0.73.0":"2026-09-10T18:21:46.876Z"},"bugs":{"url":"https://github.com/zakariagharzouli/sparda/issues"},"author":{"name":"Residual Labs","url":"residual-labs.fr"},"license":"BUSL-1.1","homepage":"https://github.com/zakariagharzouli/sparda#readme","keywords":["mcp","mcp-server","model-context-protocol","claude","claude-code","ai-code-review","code-review","guardrails","static-analysis","security","authorization","bola","ai-agents","trust-layer"],"repository":{"type":"git","url":"git+https://github.com/zakariagharzouli/sparda.git"},"description":"AI writes. SPARDA proves. A deterministic, offline gate that catches when an AI edit removes a guard, exposes a route, or breaks an invariant — no API key, right in the agent edit loop.","maintainers":[{"name":"residual-labs","email":"zakaria@residual-labs.fr"}],"readme":"# SPARDA\n\n<div align=\"center\">\n  <img src=\"assets/sparda-readme-banner-dark-1600x480.png\" alt=\"SPARDA — AI writes. SPARDA proves.\" width=\"800\" />\n</div>\n\n<br/>\n\n> 🇫🇷 **Français** — _L'IA écrit. SPARDA prouve._ Un gate déterministe et hors-ligne qui détecte quand une modif d'IA retire une garde, expose une route ou casse un invariant — sans clé API, directement dans la boucle d'édition de l'agent. Pour tout comprendre en 10 minutes (douleur, architecture, vision) : [SPARDA-EXPLIQUE.md](docs/SPARDA-EXPLIQUE.md).\n\n---\n\n<h1 align=\"center\">AI writes. SPARDA proves.</h1>\n<p align=\"center\"><em>L'IA écrit. SPARDA prouve.</em></p>\n\n**The trust layer for AI-written backends.** SPARDA compiles your backend — routes, database queries, state mutations, guards, side-effects — into one deterministic behavior graph, then **statically proves what can and can't break before you ship**: no unguarded mutation, no broken invariant, no non-atomic aggregate write.\n\n[![npm](https://img.shields.io/npm/v/sparda-mcp)](https://www.npmjs.com/package/sparda-mcp)\n[![CI](https://github.com/zakariagharzouli/sparda/actions/workflows/ci.yml/badge.svg)](https://github.com/zakariagharzouli/sparda/actions/workflows/ci.yml)\n![node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)\n![runtime deps](https://img.shields.io/badge/runtime%20deps-4%20pinned-4c1)\n[![license](https://img.shields.io/badge/license-BUSL--1.1-blue)](./LICENSE)\n\n100% local · deterministic · zero API key · no cloud account. It fails loudly on a real risk, and when it can only see part of your app it says **PROVEN (PARTIAL)** — never a false green. And when it can prove it was not even looking at your whole app, it says **PREMISE NOT VERIFIED** and claims nothing at all.\n\n## 60-second proof\n\nFrom your Express, FastAPI, Flask, Next.js, NestJS or Medusa app — nothing to configure:\n\n```bash\nnpx sparda-mcp apocalypse   # prove the tree is safe to deploy — exit 1 on any real risk, or on an unverified premise\nnpx sparda-mcp prove        # the whole verdict: proof + coverage + shareable seal\nnpx sparda-mcp badge        # a README badge: proven · coverage% · routes\n```\n\nUnder the hood it compiles your backend into one language-agnostic graph — the **Unified Behavior Graph (UBG)**, serialized as `.sparda/ubg.json` under the **SBIR** specification ([SPARDA Behavior IR](docs/SBIR_SPEC_V1.1.md)) — and every command is a pass over that graph.\n\n## The wedge — catch an AI edit that removes a guard, in the loop\n\nThe one thing a text-diff review and a pattern scanner structurally can't do: prove that **this specific edit** dropped a protection the previous version had. `sparda gate` diffs the behavior graph before/after an edit and blocks a regression — deterministic, offline, sub-second, exit 2 (the Claude Code `PostToolUse` contract that stops the agent's edit loop). See it end-to-end in one command, zero setup:\n\n```bash\nnpm run wedge     # (from a clone)  — or drive it on your own app with `sparda gate --arm` then `sparda gate --hook`\n```\n\n```\n  1. baseline armed on the guarded code   (POST /admin/delete-user · requireAdmin)\n  2. an AI edit \"simplifies\" requireAdmin → a pass-through (still compiles, still 200s)\n  3. sparda gate on the edit:\n       ✗ [critical] GUARD_REMOVED — POST /admin/delete-user was guarded in the baseline\n                    and is now reachable without any guard (src/app.js:11)\n     ⏱  ~40 ms · deterministic · offline · no API key\n     ⛔ exit 2 on --hook — Claude Code PostToolUse blocks the edit\n```\n\n**Wire it into Claude Code in one line** — the [plugin](integrations/claude-code-plugin) registers a `PostToolUse` hook that runs `npx -y sparda-mcp gate --hook` after every `Edit`/`Write`, so a guard-removing edit is caught before it lands.\n\n> [!IMPORTANT]  \n> **The Route-Compilation Proof — reproduce it yourself.** SPARDA compiles real open-source monsters to their behavior graph with **zero crashes**, each in **≈1–2 seconds**: Next.js _Dub_ (579 routes), NestJS _Immich_ (281), _MedusaJS_ (477). It natively resolves deep Dependency Injection, external controllers, and Next.js handlers. One command clones them and re-measures on your machine:\n>\n> ```bash\n> node bench/repro.mjs        # → bench/route-proof.json\n> ```\n>\n> Honesty first: _compiling_ a route is a parser result (the number above); _proving_ it safe is a separate per-repo verdict — and most real apps come back **NOT_PROVEN**, which is the true state, not a failure. (Our full 25-repo corpus stress compiles **3,565 routes** at ~150 routes/s; that one needs the corpus checked out.)\n\n**What the graph unlocks — 100% local, deterministic, 4 exact-pinned dependencies, zero API key:**\n\n| Command            | What it does                                                                                                                                                                                                                         |\n| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| **`prove`**        | _The whole trust verdict in one gesture_ — proof + coverage + premise check + a shareable seal (`--json` / `--markdown`)                                                                                                                             |\n| **`apocalypse`**   | _Prove the deploy_ — no guard, invariant, transaction or aggregate boundary can be broken (SARIF + CI gate)                                                                                                                          |\n| **`heal`**         | _Self-heal, **proven**_ — the gate Copilot Autofix doesn't have: a fix ships **only if** replay matches, `verify` still passes, and `apocalypse` finds no new risk / no dropped guard. Whoever wrote the fix, the machine judges it. |\n| **`badge`**        | _The shareable artifact_ — a self-contained SVG badge + README snippet (verdict · coverage · routes)                                                                                                                                 |\n| **`dossier`**      | _The public report_ — one self-contained HTML page: verdict, risks, and SPARDA's own blind spots                                                                                                                                     |\n| **`ubg`**          | Compile the codebase to its behavior graph (Express · FastAPI · Flask · Next.js · NestJS · Medusa natively; **any** stack via OpenAPI)                                                                                               |\n| **`timeless`**     | _Time-travel_ — record a production request, replay it byte-identically, export the bug as a test                                                                                                                                    |\n| **`mirror`**       | _Execute the graph_ — serve the compiled behavior over HTTP with no framework and no source                                                                                                                                          |\n| **`init` / `dev`** | _Runtime, optional_ — expose the graph to AI clients as a live MCP server (+ Twin, Immune, Evolution)                                                                                                                                |\n\nThe prover is the product. The MCP server is one _output_ of the graph, not the point — SPARDA compiles the whole system's behavior, then proves, replays, heals, and (optionally) serves it.\n\n**Nomenclature:** **SBIR** is the specification (the format, like \"JSON\"); **UBG** is the compiled graph itself (the artifact, `ubg.json`). The MCP server is one _output_ of the graph, not the product.\n\n## Optional: expose the graph to AI clients (MCP runtime)\n\nBeyond proving, SPARDA can turn your running app into a live MCP server — the graph, executable, with write-safety and an immune layer. This is optional and separate from the prover above.\n\n1. **Scan + inject** — run once, from your app's directory:\n\n   ```bash\n   npx sparda-mcp init\n   ```\n\n   SPARDA parses your routes (AST), generates a marked `/mcp` router, injects it into\n   your app (with a backup), and writes `sparda.json`. Every step is reversible.\n\n2. **Start your app, then start the bridge:**\n\n   ```bash\n   npx sparda-mcp dev\n   ```\n\n3. **Connect your client.** `init` prints a ready-to-paste block for\n   `claude_desktop_config.json`, pre-filled with your app's name and path:\n   ```json\n   {\n     \"mcpServers\": {\n       \"your-app\": {\n         \"command\": \"npx\",\n         \"args\": [\"sparda-mcp\", \"dev\"],\n         \"cwd\": \"/absolute/path/to/your-app\"\n       }\n     }\n   }\n   ```\n   Claude Code connects to the same bridge. That's it — your running app is now a set\n   of MCP tools your AI can call.\n\n## Try the Standalone Demo\n\nTo see SPARDA in action instantly without modifying your codebase:\n\n```bash\nnpx sparda-mcp demo\n```\n\nThis runs the entire MCP lifecycle (detect → parse → generate → inject → remove) on a bundled demo app in a temporary folder, in about 10 seconds. For the compiler itself, run `npx sparda-mcp ubg` then `apocalypse` on any Express/FastAPI app.\n\n## Black Box Report\n\nSPARDA is designed as a local organism. To see what it remembers and how much compute it has recycled:\n\n```bash\nnpx sparda-mcp report\n```\n\nThis prints a terminal dashboard aggregating your exposed tools, write opt-ins, proof journal decisions, and crystallized composite tools.\n\nTo write a self-contained, offline HTML dashboard at `.sparda/report.html`, append the `--html` flag:\n\n```bash\nnpx sparda-mcp report --html\n```\n\nTo output raw JSON for integration:\n\n```bash\nnpx sparda-mcp report --json\n```\n\n## Deployment Proof: Apocalypse\n\nSPARDA's Behavior Graph is a formal model of your system. Instead of waiting for runtime failures or relying on static analysis vibes, you can statically prove the safety of your backend before any deployment:\n\n```bash\nnpx sparda-mcp apocalypse\n```\n\nThis command reads the compiled `.sparda/ubg.json` (with zero source code parsing at runtime) and discharges five static correctness obligations:\n* **Unguarded Mutation (Critical)**: Flags any mutation path that does not cross a security `guard`.\n* **Non-Atomic Aggregate Write (High)**: Flags when an API writes to multiple tables of the same Consistency Domain (Aggregate) outside a single transaction scope.\n* **Unvalidated Constrained Write (Medium)**: Flags writes into columns with declared invariants (CHECK, NOT NULL, UNIQUE — parsed from your `.sql` DDL **or `schema.prisma`**, Prisma enums included) without prior validation (Zod/Pydantic).\n* **Irreversible Observable Effect (High)**: Flags out-of-process actions (like Stripe charges) that happen alongside state writes without a structural compensation path (like a catch-refund).\n* **Aggregate Member Bypass (Info)**: Flags mutating a member table directly without routing through the aggregate root.\n\nTo save your current graph as a safe baseline:\n\n```bash\nnpx sparda-mcp apocalypse --save-baseline\n```\n\nSubsequent runs will diff the candidate graph against this baseline to detect regression vectors:\n* Deletion of any security `guard` (Critical).\n* Deletion of a database SQL invariant (High).\n* API blast radius expansion (Medium).\n\nIf any Critical or High finding is found, `apocalypse` exits with a non-zero code to block your CI pipeline.\n\n**One step in your workflow — findings land in the GitHub Security tab (SARIF):**\n\n```yaml\n- uses: zakariagharzouli/sparda@main\n  with:\n    sarif: 'true'\n```\n\n## Time Travel: Timeless\n\nEvery production request is deterministic between its effects — the compiler knows exactly where the nondeterminism lives (db, http, clock, random, uuid: the effect nodes of the graph). Timeless records only those points (a few KB per request) and replays the request **byte-identically** against your current code, with the database, webhooks and clock virtualized from the recording:\n\n```bash\nnpx sparda-mcp timeless                # list recorded flights\nnpx sparda-mcp timeless replay <id>    # re-fly it — byte-identical or loud divergence\nnpx sparda-mcp timeless export <id>    # the production bug is now a vitest test\n```\n\nRecording is two lines in your app (ESM), with deterministic sampling and GDPR redaction built in:\n\n```js\nimport { getFlightBox } from 'sparda-mcp/src/flight/box.js';\nconst box = getFlightBox(); box.arm();\napp.use(box.middleware({ sample: 100 }));   // 1 request in 100; passwords/tokens redacted by default\nconst db = box.wrapClient(pgPool);           // your query client, tapped\n```\n\nThe closed loop nobody else has: **production bug → recorded flight → failing test → AI writes the fix → `apocalypse` proves the fix breaks no guard, invariant or transaction → deploy.** Replay is per-request (concurrent-race capture is out of scope for v1 — stated, not hidden).\n\n## Self-Healing, Proven: `sparda heal`\n\nThe loop above, as **one gesture** — and the machine judges the fix, whoever wrote it:\n\n```bash\nnpx sparda-mcp heal <flightId>                       # diagnose + write the fix brief\n# ...apply the fix (a human, or --agent \"your-ai-cli\")...\nnpx sparda-mcp heal <flightId> --check --expect '{\"status\":404}'\n```\n\nThe brief is built from the graph itself — it hands the fixer the handler's `file:line`, the capabilities the fix must not grow, and the guards it must not remove. Then the **gate** — the actual product — proves the fix on three axes at once:\n\n1. **Behavior** — lenient replay of the recorded flight (same deterministic inputs) now produces the *expected* response, not the recorded bug. The fix may reformulate a query (the tap is relabeled, allowed); it may **not** change the effect order or kinds.\n2. **Compiler laws** — `verify` still passes: the graph is still sound and deterministic.\n3. **No regression** — `apocalypse` diff against the frozen pre-fix graph: zero new critical/high findings, no guard removed, no blast radius grown.\n\n```\n✓ HEALED & PROVEN — same recorded inputs, correct output, zero law broken, zero protection lost. Ship it.\n```\n\nThe gate is honest in both directions: an unfixed bug, or a \"fix\" that silently drops a guard, keeps it **closed** (exit 1). This is the difference between an AI that writes plausible code and a system that *proves* the code is correct — the trust layer the agent era is missing.\n\n## Any Backend On Earth: OpenAPI Lowering\n\nSPARDA parses Express, FastAPI and Next.js natively — and **every other stack through the format the industry already agreed on**. Go, Java, Rails, Laravel, .NET: if it has an OpenAPI spec, it compiles.\n\n```bash\nnpx sparda-mcp ubg --openapi openapi.json\n```\n\nSecurity schemes become gating `guard` nodes, response schemas become typed returns, declared request bodies count as validated input. Pair the spec with your `.sql` or `schema.prisma` files and the full state layer — invariants, aggregates, state machines — fills in from declared truth. (JSON specs in v1; we refuse to half-parse YAML with zero dependencies.)\n\n## The Mirror VM: delete the framework, the app still answers\n\nThe graph is not a diagram — it executes:\n\n```bash\nnpx sparda-mcp mirror\n```\n\n```\nMIRROR — the graph is serving. 3 entrypoint(s) on http://127.0.0.1:4477\n  GET    /orders/{orderId}  → {amount, id, status}\n  POST   /orders  🔒 bearerAuth  → {amount, id, status}\n```\n\nNo Express. No FastAPI. No source code — just `ubg.json` answering HTTP: guards actually deny (401), responses render the compiled return schemas, unknown paths 404 with the full route table. Front-end teams develop against backends that aren't deployed yet — or aren't written yet (point `mirror` at an OpenAPI spec). Every response carries `x-sparda-mirror: true`; the mirror serves declared behavior, it never invents business values.\n\nTo undo everything: **`npx sparda-mcp remove`** restores your code byte-for-byte.\n\n## The promise — every word is backed by a test in CI\n\n<div align=\"center\">\n  <img src=\"assets/features-presentation.png\" alt=\"SPARDA Features\" width=\"800\" />\n</div>\n\n<br/>\n\n1. **Three minutes, one command.** AST scan, router generation, reversible injection — no config.\n2. **Try it for free, leave for free.** `npx sparda-mcp remove` restores your code **byte-for-byte** (tested on JS, TS, Python, even Windows CRLF files). No trace, no lock-in.\n3. **The AI cannot write until you say so.** Every POST/PUT/DELETE is disabled by default; you enable per tool, and your choice survives every re-run.\n4. **Your app defends itself.** A route failing 3 times in a row is quarantined — the AI can't hammer your broken production. Latency anomalies are flagged. Zero LLM needed.\n5. **Nothing leaves your machine.** No telemetry to us, no cloud, local key auth, 4 exact-pinned dependencies.\n6. **What it learns is never lost.** Diagnoses, descriptions, settings — versioned with your git, surviving every re-init.\n\nWhat we *don't* promise: the honest limits in [docs/SECURITY.md](./docs/SECURITY.md).\n\n## How it works\n\n1. `npx sparda-mcp init` parses your codebase (AST), extracts every route, and injects a tiny marked router (`/mcp`) into your app — fully reversible with `npx sparda-mcp remove`.\n2. Tool calls run **inside your live app process** — warm DB pools, real auth chain, real data. SPARDA adds no infrastructure: compute comes from your host process, intelligence from your AI client's own model (MCP sampling), storage from `sparda.json` + git.\n3. Write tools (POST/PUT/DELETE) are **disabled by default**. You opt in per tool in `sparda.json` — your choices survive re-runs.\n4. Suspicious docstrings are sanitized before they ever reach the AI (prompt-injection defense).\n5. `npx sparda-mcp doctor --app` audits your codebase for drift: it detects stale tools (IA seeing ghosts), unsynced routes, schema drift via fingerprints, and zombie configurations. High severity issues trigger a non-zero exit code for your CI pipeline.\n6. `npx sparda-mcp seed export/import` lets you package and share your app's \"genome\" (semantic memory, workflows, antibodies) securely, transferring immune memory between environments or across similar stacks with zero data leak.\n7. `npx sparda-mcp twin` starts a safe, simulated mock server of your backend on the original port. It serves GET calls from learned exemplars (observed response shapes & mock data) and returns simulated 202 writes without ever touching your real database or production APIs. Learn exemplars by running `npx sparda-mcp twin --learn`.\n8. `npx sparda-mcp grammar` maps the graph of valid sequences of tool calls (observed circuits and candidate hypotheses) to prevent LLM hallucination of routes.\n9. `npx sparda-mcp evolve` mutates candidate chains and tests them against the twin in-memory, promoting successful chains to evolved workflow suggestions.\n\n## What SPARDA gives your AI\n\n### Operate, not just read\nEvery route becomes a tool that runs against your live process — real auth, real data,\nwarm connections. One call to **`sparda_get_context`** hands the AI the whole living\npicture: enabled tools, suggested workflows, runtime telemetry, quarantine state, and\nimmune memory — so every session resumes where the last one stopped.\n\n### Write-safety: the AI can't write until you say so\n- Writes (POST/PUT/DELETE) ship **disabled**. Enable them per tool in `sparda.json`; your choice survives every re-init.\n- An enabled write is **never executed on the first call**. SPARDA returns an `awaiting_confirmation` envelope — a single-use token plus a preview of the action — and commits only after an explicit confirm step.\n- When your client supports MCP elicitation, that confirmation prompt appears **in the AI's own UI**.\n- **Proof-after-write**: every successful write is followed by a read-back of the same resource, so the AI — and you — see the real effect, not a hopeful guess.\n\n### Your app defends itself — zero LLM on the hot path\n- **Quarantine.** A tool that returns 3 consecutive 5xx is quarantined: further calls get a `503` with a reason and a retry delay instead of hammering your broken route. After a cooldown it half-opens for a single probe.\n- **Latency & anomaly flags.** The router learns each route's baseline and flags deviations locally, in a few lines of math.\n- **Adaptive diagnosis, only on surprise.** A genuinely new failure wakes your AI client's own model to diagnose it once; the diagnosis is cached as an \"antibody\" in `sparda.json`, so the same failure later costs zero tokens. Cloning your code doesn't clone its immune memory.\n\n### A free intelligence layer, zero API key\nOn first connection your AI client's own model (via MCP sampling) rewrites raw routes\ninto business-language tool descriptions and proposes multi-step workflows — cached in\n`sparda.json` and exposed as MCP prompts. Nothing to configure, nothing to pay.\n\n### It gets cheaper the more you use it\n- **Response recycling.** When a read keeps returning the same answer, SPARDA serves the next identical call straight from memory — without touching your host app. Reads only; writes always hit the host.\n- **A recycling gauge.** `GET /mcp/stats` counts how many calls were answered from SPARDA's own knowledge vs. how many paid the host route. It reads 0% on day one and fills with usage — a measure, never a promise.\n\n### Tools nobody wrote — Labs, opt-in, default OFF\nTurn it on with `\"labs\": { \"recordSequences\": true }` in `sparda.json`. SPARDA then\nnotices when one tool's output feeds the next tool's input and records the *circuit* —\nstructure only (tool names, argument names, counts), never your data. A read-only\ncircuit seen enough times **crystallizes into a composite tool**, announced\nmid-session: one call runs the whole chain, auto-feeding each step from the previous\nstep's real response. Write routes are never absorbed — their per-call confirmation\nalways stands.\n\n### Living context & telemetry\n`GET /mcp/stats` (per-tool calls/errors, tool \"purity\", quarantine state) and\n`GET /mcp/events` (errors, latency anomalies, cached diagnoses) expose exactly what\nyour app is doing — surfaced to the AI as live notifications.\n\n## Built for AI clients: the bundled Skill\nSPARDA ships with an Agent Skill ([`SKILL.md`](./SKILL.md)) that teaches any compatible\nAI client how to drive a SPARDA server to its **full potential** — call\n`sparda_get_context` first, exploit response recycling, honor quarantine, prefer\ncrystallized circuits over re-walking a chain, and follow the two-phase write-confirm\nprotocol. The live, per-project tool list always comes from `sparda_get_context` at\nruntime, so the guidance never goes stale.\n\n## Supported frameworks\n\n- **Next.js App Router (13/14/15)** — file-based injection. SPARDA creates a catch-all route handler. It natively resolves wrapped handlers (`export const POST = withAuth(h)`) and deep effect chains.\n- **NestJS** — AST-based router injection. Deeply resolves Multi-hop Dependency Injection (Controller → Service → Repository), inherited DI, and `baseUrl`/`paths` imports. Supports Prisma, TypeORM, and Kysely.\n- **Express 4/5** (JS/TS, ESM/CJS) — AST-based router injection. Deeply resolves external controllers, Mongoose schemas, and barrel re-exports. Uses dynamic tree-scanning to find non-standard entry points (`bootstrap.ts`, etc).\n- **MedusaJS** — Native AST ingestion of complex e-commerce routing.\n- **Any Backend On Earth (Go, Java, Rails, Laravel)** — Compiles flawlessly from OpenAPI 3.x specs.\n- **FastAPI** (Python >= 3.9) — AST-based router injection.\n\n## Security posture (honest)\n- 4 runtime dependencies, exact-pinned.\n- **Dynamic Local Key Resolution.** The generated router contains no baked secrets. It resolves authorization keys at runtime from the `SPARDA_LOCAL_KEY` environment variable or the local gitignored `.sparda/key` file, and fails closed (503) when neither is found. For custom production or staging setups, you can override this behavior by exposing `SPARDA_LOCAL_KEY` in your environment.\n- Local key on every router call; self-reference loop protection; 30s timeouts; 8 KB output truncation.\n- AST-positioned injection with backup and post-injection re-parse; `npx sparda-mcp remove` leaves a clean git diff.\n- Persistence is **value-free**: SPARDA records structure (tool names, field names, fingerprints), never your payloads.\n\nFull threat model and known gaps: [docs/SECURITY.md](./docs/SECURITY.md).\n\n## Documentation\n- [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md) — how `init`, the injected router, and the bridge fit together, plus the `sparda.json` schema.\n- [docs/SECURITY.md](./docs/SECURITY.md) — threat model, defenses, and honest known gaps.\n- [docs/TESTING.md](./docs/TESTING.md) — how the promises above are kept honest in CI.\n- [docs/ERRORS.md](./docs/ERRORS.md) — the error knowledge base.\n\n## Beyond the open core\nSPARDA is free, including in production (see License). Team-scale capabilities —\nfine-grained per-person access policies and a signed, tamper-evident audit log — are\nplanned for a future paid tier. The open core stands on its own; nothing here is\ncrippled to upsell you.\n\n## License\n[Business Source License 1.1](./LICENSE) — free to use, including in production.\nYou may not resell SPARDA or offer it as a competing commercial service.\nEach version converts to Apache 2.0 four years after its release.\n\n<div align=\"center\">\n  <img src=\"assets/github-star.png\" alt=\"Leave a Star\" width=\"600\" />\n</div>\n\n<br/>\n\nBy [Residual Labs](https://residual-labs.fr)\n","readmeFilename":"README.md"}