{"_id":"@dezhouzhang/archery-query-mcp","_rev":"29-0220e4107f80a0c46c34edc9a6a70c8d","name":"@dezhouzhang/archery-query-mcp","dist-tags":{"latest":"0.4.15"},"versions":{"0.1.0":{"name":"@dezhouzhang/archery-query-mcp","version":"0.1.0","_id":"@dezhouzhang/archery-query-mcp@0.1.0","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"e4431bf1a8aa178548efcd3177caca1becdaaaf8","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.1.0.tgz","fileCount":66,"integrity":"sha512-6/vOUjZ6elk++8e66ykQ+D8BpBHv84Y415TbqqZjcbDAMQhJbHY6TeUPGZHUJZ4dnkybcRJiySyG2m0DRIt6HQ==","signatures":[{"sig":"MEUCIQDnDLGjBO/ycabWdWMrJbVnqfnekLAlwJ47bp5t8TqWFAIgCHXytz9Ymao5/WAKU819f1RzrN13U9fMO+puJXJyDW8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":122520},"type":"module","engines":{"node":">=20.0.0"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.1.0_1782294793734_0.3914078179195182","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@dezhouzhang/archery-query-mcp","version":"0.2.0","_id":"@dezhouzhang/archery-query-mcp@0.2.0","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"51492f4b08014c82990229ebd81e7876c2cfbc06","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.2.0.tgz","fileCount":70,"integrity":"sha512-VvuY+ArpxG/KXkccgbapsT8yZwqGoF+Fm6UwLadmOgYdtjEVEJiMHklEAerTxjS2fpEG58dB5MOrX2V74QQG0w==","signatures":[{"sig":"MEUCIGiiC6wfdbG4w/JyOffjcb72YpMnAu9fj7XZ4Lx3Fn/vAiEA31v7u5aT/Dx3y5R5ec13IPj2lPDvkfC6m4CBRZiRLvw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":141399},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"588a330fc173265d6123b566b722b931180d6079","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.2.0_1782358412894_0.4723301733559344","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@dezhouzhang/archery-query-mcp","version":"0.2.1","_id":"@dezhouzhang/archery-query-mcp@0.2.1","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"d5291cecef9527f74c4be2f15078abea3dcaf906","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.2.1.tgz","fileCount":70,"integrity":"sha512-p1YJTuJCJtVczeB0cquXDMA/rbxmO4J8GsgGoqxENOKae5ty+fALbd5fo6LYvPnIXByqzvO+SXtvpTm1ihLZGw==","signatures":[{"sig":"MEYCIQD+R7h8/mb9ZuumIui5qID5V+K2CVWBWd/RVKpLkmP30QIhALpEsmI/ZtD0Aht6Bkx+yeLK4XbgjTQGrhoLxq8vJTVu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142358},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"eabbe0fd7a62e71164ff2b82c6f7c77807306b74","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.2.1_1782365719227_0.6857520700162438","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@dezhouzhang/archery-query-mcp","version":"0.2.2","_id":"@dezhouzhang/archery-query-mcp@0.2.2","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"52818da0119a933bdfbe36454e1e408bc87bc8e0","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.2.2.tgz","fileCount":70,"integrity":"sha512-+AgarTMWkhfTFBrGMdQpyMbmEQdQLzUY4MmvJF5NsZPg19y9NF/vLAwerIhxFOYk4Ii0L+Bl75xWAia+TULOrA==","signatures":[{"sig":"MEUCIQD3Bsbkw0VehB9ogpkTsL9dqXxBHnbDAJthtHnkUbY07wIgHzZLquyvO2ZQz/+Zo4roEjVYvZp8lD6m9moenL2EWMA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":143465},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"29f4f51b4d5cbf4fe73b00d51c5359125fa0d574","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.2.2_1782366271089_0.010289876500966688","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@dezhouzhang/archery-query-mcp","version":"0.2.3","_id":"@dezhouzhang/archery-query-mcp@0.2.3","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"23b6aef6b3932a6b00f75e4c2b68a93491cc0f5b","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.2.3.tgz","fileCount":150,"integrity":"sha512-z8mNaXpRGAv3/ifzUmv5ttQ1yp4JmXadWiVrO7mXm90psJzMzuAgaDdbdsfOX0hZ8aXcOLFwT8MhqplQe5m/5w==","signatures":[{"sig":"MEYCIQCBI3rkU5hH858TUjciP4paeRch0zn6r+0UZfjYHkcVyQIhAMkgBOXa3pUubVtw6e3g7gOloFS++H7wO/EgtFYRsfn4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":371983},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"44d21d2abe2d6227fd10291122fbc7e4be2522a4","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.2.3_1782565020145_0.2457443839508513","host":"s3://npm-registry-packages-npm-production"}},"0.2.4":{"name":"@dezhouzhang/archery-query-mcp","version":"0.2.4","_id":"@dezhouzhang/archery-query-mcp@0.2.4","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"7979a24aae006098f6867057cc46418ecc0aad8d","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.2.4.tgz","fileCount":170,"integrity":"sha512-GadPjm4I9a2Sn6QSTNngsvoymsWVbO5vgVM3VO1TaVlstKjBL/YmL4QB6U1zxJs2XqsjFORm81r7B7rLppwK/w==","signatures":[{"sig":"MEYCIQDkGTgGqsO8SeBsiT/zrrjyd1Y+XuEIVJbQFYEQYFbV2wIhAP+z7jNuwDHoFqLXFa767Hwd2JYDmrBYclrMCG2mF3kz","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":404585},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"378e47f6291683667bd5bcbf745fb33c419142f1","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.2.4_1782577818213_0.8953206481518712","host":"s3://npm-registry-packages-npm-production"}},"0.2.5":{"name":"@dezhouzhang/archery-query-mcp","version":"0.2.5","_id":"@dezhouzhang/archery-query-mcp@0.2.5","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"74b8359d3578412b5a1b87eee21ee3334449c59b","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.2.5.tgz","fileCount":186,"integrity":"sha512-6g1SKTwdHO9sRsfN6ciN/Hf4sV2QXaT4pJGFoOXLiYuOwVe2jYDQ2mfXmWnA7sIxZ2u+IDBIreKS+JGbjapgBQ==","signatures":[{"sig":"MEYCIQC0MbXmwxLuJ3e2xKayyPp5+URQbhVB1zCxdCePqef+YAIhALhDh96B9o/G7mAkl4TY5cidA1NGKN8l946d0AQ7bngo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":441429},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"720b763c436e045363eb8f96b98395bbe51aa664","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.2.5_1782611071201_0.9085805182264661","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.0","_id":"@dezhouzhang/archery-query-mcp@0.3.0","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"e6ffa2c3914521bacce5de14c047608a2bf8f7a6","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.0.tgz","fileCount":186,"integrity":"sha512-JToqe1uizsz+QyVjKvCOOtQ8beZCZouCyyB6BjSLPsqRWXRIDzFE2Ih1XhydHqlzL5qFM4olzuYQUjD2OoYL8A==","signatures":[{"sig":"MEQCIBGla9FX0b4awLkkyMaAq9rVdyLuZfF4fNXZv8H8eo5jAiBHaRR2VieKSoDqRUMtnQ02S6qej89ncnf7D/cZnquDJQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":474246},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"a731f2e67e10239537f72fa93009fc0b7ec609d3","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.0_1782617970537_0.08455945989933822","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.1","_id":"@dezhouzhang/archery-query-mcp@0.3.1","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"233225d5c4fe2bc0e5a54bcb948744301c5567a2","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.1.tgz","fileCount":186,"integrity":"sha512-2TFfjBHY8iLR2WE+78ZPF89yatGeUs+9o3sBEtwDA3Wo3Pa1YuD3OcgMXPHYU4Hv4cCYDY4rLcrY8EF6+mc9Pw==","signatures":[{"sig":"MEQCIA4+NqP1kWpFjduQ1yzSLgJE//m+H8lGtHDTLQp1ldoaAiADeRtSAhMZxh3UIXLaPFzuArZ4OQL0yEIPyK+7gTS/uQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":467504},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"345bb9ac41d4edf550052371824a158f35f708ca","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.1_1782697847650_0.3226474369339556","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.2","_id":"@dezhouzhang/archery-query-mcp@0.3.2","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"e0c8bc6ae729591ce7a7402ab9c4bc7a9dadd09b","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.2.tgz","fileCount":186,"integrity":"sha512-qvZ9Y6oFtYqcBKy1O+UfSqysJcjr4jchTErcWDkybu53QEjCDvdtF5XCLzyKrfkYPbrwh7YAcNEpOgXu0lAhdQ==","signatures":[{"sig":"MEYCIQCM4CFFEF8XISxTa3PmRGOncPaD9FAPh+nX0kQZ1pXgZQIhAJG5wZ3nm6hIDO+0SUUVWOyyM7RezXZzd+1y1DNq1aab","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":474444},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"dc94e304a4eda5b7b177837334f14179f432eb66","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.2_1782702892941_0.15835112599879375","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.3","_id":"@dezhouzhang/archery-query-mcp@0.3.3","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"d0c8ad7855aab256d618b73a64ef42570de84c84","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.3.tgz","fileCount":186,"integrity":"sha512-2xHe+++HIxicvYuVJRxzTIY+ZlQsnIsb0DnL0M6lgYRcmd5HQMhV3kfMJ+5s4PcwUKdhnPIz0nZNrCPJzRHHAw==","signatures":[{"sig":"MEUCIGqngdgYfO2kRxNsUgUUFJVPDiiuoPyPf1UwGMEGSSGuAiEAnzzBxSuKIqQ6NRVhoWuMPRUHCNDIzPxk8T39QThuKnI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":478015},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"a3da08803e7b9f2eb658bd40c85abfc6bc422ec9","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.3_1782883698263_0.7008101466689971","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.4","_id":"@dezhouzhang/archery-query-mcp@0.3.4","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"553c8aa17ea7d47efbc00a9b63d271340986b098","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.4.tgz","fileCount":190,"integrity":"sha512-Pw18LZDgQwjFgTIjoSkGi1ssRcsZQjs3LHrnJiIcVcJWzfTIny561UJU+dhJMOKIhMGD8SOBG7bl+l4K1jAHNw==","signatures":[{"sig":"MEQCIBCXaAoV1EBCc1OMtDMhyYIPfIPzh4SuKiZ+/8/ZOntkAiAJjAlg8SPUD0SzUfBxvAHNINvcxCpMFWGsCGksv7z5Mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":493037},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"7a38b76f55a587173483668974b04b6fd37f2de1","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.4_1782885672665_0.020948722095234906","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.5","_id":"@dezhouzhang/archery-query-mcp@0.3.5","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"2e5219ac9c1d84e3523f574430f532d7b126c461","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.5.tgz","fileCount":190,"integrity":"sha512-XG0SnI1kwW76+KpJw4NthGPCEPCwjoAA/Rharfnz9Mxti1faLaHIHqJbAl1IHoBbSUb0Myyo3T0TrIN8qJbDqA==","signatures":[{"sig":"MEUCIGdDOHIK9V98tRiCMzwD+p4hQmEOpkOGsowWZw4tb+TQAiEAvitoyZsaSoiHmfYmqAEHC225WcLbeywOul3qcaRV/Ew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":493772},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"a9d5974c6ed1ba3258d8c5ab33d3d46e94b8cea3","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.5_1782898083280_0.7569591493119685","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.6","_id":"@dezhouzhang/archery-query-mcp@0.3.6","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"d67ee54a999d447960f26ff2c16fa16c3a28a122","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.6.tgz","fileCount":190,"integrity":"sha512-3UykjaLWbo8W6VScJ9gckAdGbLAwREH+5GXEDxC1XP1lj1tg0qEEDg/sxQuRaeiB6UHIpaAH5LsO3WX5hGu2aw==","signatures":[{"sig":"MEQCIFSGz3mJ/OD2m4YoANlNq0Sl1qHGoLkFYD6MYtTL5y1QAiAkQx2sQmill2tPEVrJ6fmo6p2qNoIo90dGe4WXo3kPLQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":497451},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"3fa34c3cdb372f7325be37e01c0ac2e940983c2f","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.6_1783660660641_0.3945375774715376","host":"s3://npm-registry-packages-npm-production"}},"0.3.7":{"name":"@dezhouzhang/archery-query-mcp","version":"0.3.7","_id":"@dezhouzhang/archery-query-mcp@0.3.7","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"076995333cad259c3bb01281bba6085d05f6d4d6","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.3.7.tgz","fileCount":194,"integrity":"sha512-bBxlY+el1lV5OShlWhY0ohSPYbT+kNSiY06K8SU4mUyrhwi+T7U/oBoOxmAELWdcRLKv4xkIs7Lqg/QjPo9GrQ==","signatures":[{"sig":"MEUCIQC36lpUvsMn8eXZVTELB8Vu9iT2EO92BHLdICNqOtkFaAIgcmsKuqdxx38iF5mxqvZDm/NnkWLSOz9ZfT7OcsZ4QEc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":557246},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"39346127030b43d71d180a25c2c953506004a7ba","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.3.7_1784206622602_0.3560749725687209","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.0","_id":"@dezhouzhang/archery-query-mcp@0.4.0","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"7ef8d72d0b429b00de9f096ca219f6f0ae2e9860","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.0.tgz","fileCount":198,"integrity":"sha512-EvNg5q8HBDwjLFqHDOgCx5pI/pC3Juw8uY6EcCvTka3MejfMp+1oZSdHOXtFNrt2OKwimt23rUcGKEFV0qkzgg==","signatures":[{"sig":"MEYCIQDz76EkrEkJgf8fXRoE9Ya0sxZdJ4lJ6z68sGrz0G5dJgIhANaD82DYlEoIV8Q30/aPkHOP+oQtKoky7DmzJCwjmTr8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":557010},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"15220d6ae5a5021aa3b59ca8f4a4d1b140779675","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.0_1784722166439_0.08258283141952738","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.1","_id":"@dezhouzhang/archery-query-mcp@0.4.1","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"0f5203ab0f60dba1b5fc541a13f13af56ec0f674","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.1.tgz","fileCount":202,"integrity":"sha512-SgIJ/iGSuDdO8kn27UT5nk1KLh2rZMeCIMLO0pqQw7zUrcC/ajqIXuJWnj8ZH46HQUE8yCY4an4VHmIaYKdKWA==","signatures":[{"sig":"MEUCIBdIguU+kZyR+pdvD/pgYIvEjEboT+KI/D7S4srT1BOQAiEA5TjloA+TZ73+Og+HFknrZP39/GiygLAJAUf0eSBo3Cw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":594024},"type":"module","engines":{"node":">=20.0.0"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.1_1785224674567_0.5300873563536781","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.2","_id":"@dezhouzhang/archery-query-mcp@0.4.2","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"2d3ba7de3fdd100f612611c1e5a2a5858c4da0f6","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.2.tgz","fileCount":210,"integrity":"sha512-EAPTNqyFZ4CTA4SQDUqR2y7NnGt/CKWnNRk1zZYvxFnUWU5FvJ9j5I7I2Y+VwEnOQXbmhNN2FfIYcBuUybBVVg==","signatures":[{"sig":"MEQCIHWcO9k9qAnq8K5lgDzFxJ7p3On2zWi6NjsIeROqDq7fAiAg15fsUNY2wNcBz5kUs9XNkf7WiJWlT7faosKmmtpshQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":636194},"type":"module","engines":{"node":">=20.0.0"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.2_1785860158849_0.7561534356734356","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.3","_id":"@dezhouzhang/archery-query-mcp@0.4.3","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"fff7c76e74aff5dbec8bff2f61cead03006ee81b","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.3.tgz","fileCount":210,"integrity":"sha512-vjJl6FsuoUVzB+PV4Ktx82X2jjZo6ULPUtTkf898fF2nIyAf7NXd0XmPShebIkb6diZeOIZMinummETWeJLjFA==","signatures":[{"sig":"MEUCIA8WQKkGvHexyVGGnouTmhYAoWTf5jmoeTKjmgHgFe2kAiEAgEhr2nxGycR4Rls5wlY4gHawU9Lycqi2agqk3KadNXs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":636786},"type":"module","engines":{"node":">=20.0.0"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.3_1785861569434_0.5155057298766794","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.4","_id":"@dezhouzhang/archery-query-mcp@0.4.4","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"9655bd24c3c802cebe4c44e08b7ae90acafa0ae1","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.4.tgz","fileCount":210,"integrity":"sha512-xtJOr04PR8V9R7nYY86LdZuCAbhHfPHkByqloSc2v4a4SKSljgl8C96X3M3bl+v2fKy2OzGGk0dn1xW1vCYAyg==","signatures":[{"sig":"MEUCIQCc8RO76ruFD2WMYK4Humht+/snBmSf2LfYn0KkGrSMXwIgDJ5bo+adRHrSuJUT6/uV8vC8XoXJ1EsITFJmqzpLXeo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652240},"type":"module","engines":{"node":">=20.0.0"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.4_1785919467658_0.5830051593295329","host":"s3://npm-registry-packages-npm-production"}},"0.4.5":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.5","_id":"@dezhouzhang/archery-query-mcp@0.4.5","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"3499d7330b61140d3639389991d18a0779670e79","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.5.tgz","fileCount":210,"integrity":"sha512-mEnVPZHqzheIUo3mr0+W7gdOSpComfnPNXsVrQcKddT6H3rMVB2/NnmIMV2gA9rjpYysIMH7AIYjsOHMcaCLFA==","signatures":[{"sig":"MEYCIQDREq8lOB5TBIszYcwnR2TLCwQCuuKEjYL1fXq49bFiTgIhAKhVrSNLQkT4XCYHvo4FnMDmg7VIff7teu7Df/Iqbv4D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":652677},"type":"module","engines":{"node":">=20.0.0"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.5_1786017757517_0.14915907614873225","host":"s3://npm-registry-packages-npm-production"}},"0.4.8":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.8","_id":"@dezhouzhang/archery-query-mcp@0.4.8","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"2cfd5bdbbf51f4ca19f2120d6e70767a53deb127","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.8.tgz","fileCount":210,"integrity":"sha512-R/1fIw5qCwZHMHrEIF9k1i8dmV8J4GLjqe1+xc3dfIqKAvWMfxsPmnpgLo0xjYbjEYKKwvvFZT0yyJuM2BPFGA==","signatures":[{"sig":"MEUCIQCGAOdlXpzuCJu3rKgSEo4VGr+IB0vay+dXZi2iFK7WyAIgFJopkg5bqTu/lnDHZ8ONp4JtKt+9cuvIsZczxlQKAVI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":654175},"type":"module","engines":{"node":">=20.0.0"},"scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","verify":"npm run typecheck && npm test","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio","release:check":"npm run verify && npm pack --dry-run","prepublishOnly":"npm run verify"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.8_1786023472176_0.4899729560137891","host":"s3://npm-registry-packages-npm-production"}},"0.4.9":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.9","_id":"@dezhouzhang/archery-query-mcp@0.4.9","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"93f128dc53f378349a569c466da4fd555d1cec44","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.9.tgz","fileCount":210,"integrity":"sha512-QndCSsoJVanEyxnKIcVxQYwlP5sC5tDNc/vV5ewEpJXsh5gXRReFi4h/36D+n1EZTfuKRYp9nolc1Uxo+rHP2w==","signatures":[{"sig":"MEUCIQDcwgZr9OMd0KlUz6jcJ2/RulYQRNUDNF1v6VGa2Pi/XgIgfeSfsE1U8dDz4plLVvYTPTLppdHTmwadG+YX6/i/HZQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":657163},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"62c092caf061aea2f4812daf2d2207583fbffbfd","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","verify":"npm run typecheck && npm test","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio","release:check":"npm run verify && npm pack --dry-run","prepublishOnly":"npm run verify"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.9_1786368987977_0.41368543253111056","host":"s3://npm-registry-packages-npm-production"}},"0.4.10":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.10","_id":"@dezhouzhang/archery-query-mcp@0.4.10","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"96fed98c1fa62bf6c5696d443e0bd3ea7389f9b9","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.10.tgz","fileCount":210,"integrity":"sha512-CQGGiQ/dYihZn0eNxmAQkXofPGcDTJpVBx2pWdhFxTHcHyxVjmfUbleSu8Br8VT3MjRCvslx2YdQe8U+hcRPzw==","signatures":[{"sig":"MEUCIGbKDwWA6tynOwDvjgqCdbLNbygtpstt8EhJfZhKHYSRAiEA5biY7cEkJPTHcw85Bzbax+S6I8qL41qSAbaPMAqffew=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":660158},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"95be86a2082df0c5fbb4e7e4852844de6a88f9cf","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","verify":"npm run typecheck && npm test","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio","release:check":"npm run verify && npm pack --dry-run","prepublishOnly":"npm run verify"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP server for querying Archery safely via stdio or HTTP","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.10_1786426872410_0.8134251075416352","host":"s3://npm-registry-packages-npm-production"}},"0.4.11":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.11","_id":"@dezhouzhang/archery-query-mcp@0.4.11","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"30d058436dc414558ca8f9f2c8e33b438df339a8","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.11.tgz","fileCount":238,"integrity":"sha512-efdZRJXNkSiaw7wFtdRUXck2raLowqZ+f/DyJAwL+MspY9O5i3MDZhbtoFkwp0dkgLswah1E6dtbx1NN5Rsh5Q==","signatures":[{"sig":"MEYCIQCDCQbd5MyQJiyYeYTYRmkQEuHGnOAicHvORs8m+BFqhQIhAOO19hFhol8rYqyGTu9U4khQnTz/7TErWB3JuYh4Gx2W","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":707254},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"2188392f8fedf2f183c7f10d4926893de08689d0","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","verify":"npm run typecheck && npm test","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio","release:check":"npm run verify && npm pack --dry-run","prepublishOnly":"npm run verify"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP services for querying Archery databases and Kafka topic history safely","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.11_1787028299883_0.1483385857168409","host":"s3://npm-registry-packages-npm-production"}},"0.4.12":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.12","_id":"@dezhouzhang/archery-query-mcp@0.4.12","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"2256c9673c80a09049366e7d891c294754fb318c","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.12.tgz","fileCount":238,"integrity":"sha512-8j42j2/wOS5EtbPiyc0I9BkVZ0OTCb1XwjqMB24xqsOIt4rhhIpEypt6s+vdgutWXIVhHQ2kDQceen5GaRkOPA==","signatures":[{"sig":"MEQCIDtIUAPlRFI/7mCjG3/lBOQ7cRLWvdEkHv0lY0uh9TCtAiAtIDLU0ZXIcAxmmCWQS95ZAmPzRox4ElnQF9lndJ0mPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":711170},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"af37b8fb79b0250df209f634c80b5192fddeb57f","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","verify":"npm run typecheck && npm test","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio","release:check":"npm run verify && npm pack --dry-run","prepublishOnly":"npm run verify"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP services for querying Archery databases and Kafka topic history safely","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.12_1787043865953_0.14531881692256854","host":"s3://npm-registry-packages-npm-production"}},"0.4.13":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.13","_id":"@dezhouzhang/archery-query-mcp@0.4.13","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"bf9997b0f5ddd43219f7020d3e6538a5ec5117d1","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.13.tgz","fileCount":242,"integrity":"sha512-xRa4w9K4JP3UxPNOGRyjFfsxwrAOzVIRh018pow4JmDAlZJmt3lG1R2Kz0qrYR3YKatpkERiUUxLc2i+AL6bTQ==","signatures":[{"sig":"MEYCIQCJwcBibZrSbVCD1Mq5jC+8TZDm5J6qdA1jAf4oicuxhwIhAL4Gpq68MK4Dehni8k4JVVX2CiMZoPKTMLyAxsbi1jql","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":722971},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"de72f4aec3e939623194e51996d1d13842afb35b","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json","verify":"npm run typecheck && npm test","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio","release:check":"npm run verify && npm pack --dry-run","prepublishOnly":"npm run verify"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP services for querying Archery databases and Kafka topic history safely","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.13_1787117830515_0.1451665582477184","host":"s3://npm-registry-packages-npm-production"}},"0.4.14":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.14","_id":"@dezhouzhang/archery-query-mcp@0.4.14","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"bin":{"archery-query-mcp":"dist/cli.js"},"dist":{"shasum":"9d28576c96b81f9b066bcca28efa7c7e10dda630","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.14.tgz","fileCount":245,"integrity":"sha512-K5ygBzqvrtl3B3h9dv8+joUAn0wp1hL4Sfp5Sc/iBCx/7daP8HIygrMcPU3zqFRAYNqJA0kMI7mWFXyqGfbaEA==","signatures":[{"sig":"MEUCIQC2PlsEQOZQyD7JTMAb3lmL2M/GhpSwoxG5ln4K4TqcMQIgb3lyc/yat19TBRv8MCPkaa3eu0fXg1UJchbkQ1tTgEk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2440644},"type":"module","engines":{"node":">=20.0.0"},"gitHead":"172135802d6315c5fbcd46cd858ed4385011fea8","scripts":{"test":"vitest run","build":"tsc -p tsconfig.json && npm run build:standalone","verify":"npm run typecheck && npm test && npm run build && npm run verify:standalone","prepare":"npm run build","typecheck":"tsc -p tsconfig.json --noEmit","start:http":"node dist/cli.js --transport http --port 8080","start:stdio":"node dist/cli.js --transport stdio","release:check":"npm run verify && npm pack --dry-run","prepublishOnly":"npm run verify","build:standalone":"node scripts/build-standalone.mjs","verify:standalone":"node scripts/verify-standalone.mjs"},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"_npmVersion":"11.16.0","description":"MCP services for querying Archery databases and Kafka topic history safely","directories":{},"_nodeVersion":"26.3.0","dependencies":{"ky":"^1.14.0","zod":"^4.2.1","hono":"^4.10.7","commander":"^14.0.2","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.16","esbuild":"^0.28.2","typescript":"^5.9.3","@types/node":"^25.0.3","@biomejs/biome":"^2.3.8","@types/proper-lockfile":"^4.1.4"},"_npmOperationalInternal":{"tmp":"tmp/archery-query-mcp_0.4.14_1787229448614_0.14744819927425268","host":"s3://npm-registry-packages-npm-production"}},"0.4.15":{"name":"@dezhouzhang/archery-query-mcp","version":"0.4.15","description":"MCP services for querying Archery databases and Kafka topic history safely","type":"module","bin":{"archery-query-mcp":"dist/cli.js"},"scripts":{"build":"tsc -p tsconfig.json && npm run build:standalone","build:standalone":"node scripts/build-standalone.mjs","prepare":"npm run build","prepublishOnly":"npm run verify","release:check":"npm run verify && npm pack --dry-run","typecheck":"tsc -p tsconfig.json --noEmit","test":"vitest run","verify":"npm run typecheck && npm test && npm run build && npm run verify:standalone","verify:standalone":"node scripts/verify-standalone.mjs","start:stdio":"node dist/cli.js --transport stdio","start:http":"node dist/cli.js --transport http --port 8080"},"dependencies":{"@hono/node-server":"^1.19.8","@modelcontextprotocol/sdk":"^1.29.0","commander":"^14.0.2","hono":"^4.10.7","ky":"^1.14.0","pinyin-pro":"^3.28.2","proper-lockfile":"^4.1.2","zod":"^4.2.1"},"devDependencies":{"@biomejs/biome":"^2.3.8","@types/node":"^25.0.3","@types/proper-lockfile":"^4.1.4","esbuild":"^0.28.2","typescript":"^5.9.3","vitest":"^4.0.16"},"engines":{"node":">=20.0.0"},"gitHead":"d8fa870ee48c7199136b8cafd22e06db884c3155","_id":"@dezhouzhang/archery-query-mcp@0.4.15","_nodeVersion":"26.3.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-HTXuVFQNQkQ9N8Zt7xQgIzeg9jig+8ryvXaaopOSvsSctoTQWDrcXZmTbdebv6/y+W+PRnnG3CS45MMenknVKw==","shasum":"b5fc329ac474d441bfeaaa0036da85dc01dae35c","tarball":"https://registry.npmjs.org/@dezhouzhang/archery-query-mcp/-/archery-query-mcp-0.4.15.tgz","fileCount":249,"unpackedSize":2454477,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAwYsizfiThteb7BbYzALFg9EjHZ5sGffSVuA2uvQuvaAiEA/Hhhgt76qYJoj7oBac7QROCR25tLZMkhCaymv6QKiZg="}]},"_npmUser":{"name":"derek.zhang","email":"feer199307@gmail.com"},"directories":{},"maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/archery-query-mcp_0.4.15_1787231841241_0.2440440712810501"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-24T09:53:13.545Z","modified":"2026-08-20T13:17:21.667Z","0.1.0":"2026-06-24T09:53:13.860Z","0.2.0":"2026-06-25T03:33:33.022Z","0.2.1":"2026-06-25T05:35:19.389Z","0.2.2":"2026-06-25T05:44:31.238Z","0.2.3":"2026-06-27T12:57:00.272Z","0.2.4":"2026-06-27T16:30:18.358Z","0.2.5":"2026-06-28T01:44:31.353Z","0.3.0":"2026-06-28T03:39:30.684Z","0.3.1":"2026-06-29T01:50:47.823Z","0.3.2":"2026-06-29T03:14:53.101Z","0.3.3":"2026-07-01T05:28:18.403Z","0.3.4":"2026-07-01T06:01:12.814Z","0.3.5":"2026-07-01T09:28:03.433Z","0.3.6":"2026-07-10T05:17:40.803Z","0.3.7":"2026-07-16T12:57:02.745Z","0.4.0":"2026-07-22T12:09:26.590Z","0.4.1":"2026-07-28T07:44:34.729Z","0.4.2":"2026-08-04T16:15:58.978Z","0.4.3":"2026-08-04T16:39:29.621Z","0.4.4":"2026-08-05T08:44:27.814Z","0.4.5":"2026-08-06T12:02:37.681Z","0.4.8":"2026-08-06T13:37:52.337Z","0.4.9":"2026-08-10T13:36:28.108Z","0.4.10":"2026-08-11T05:41:12.565Z","0.4.11":"2026-08-18T04:45:00.014Z","0.4.12":"2026-08-18T09:04:26.107Z","0.4.13":"2026-08-19T05:37:10.664Z","0.4.14":"2026-08-20T12:37:28.799Z","0.4.15":"2026-08-20T13:17:21.459Z"},"description":"MCP services for querying Archery databases and Kafka topic history safely","maintainers":[{"name":"derek.zhang","email":"feer199307@gmail.com"}],"readme":"# @dezhouzhang/archery-query-mcp\r\n\r\n用于安全查询 Archery 数据库和内部 Kafka Topic 历史的 MCP 包，适合接入 OpenCode、Codex 等支持 MCP 的客户端。两个数据源运行在独立 MCP 进程中，不共享工具、认证或查询状态。\n\r\n数据访问路径始终是：\r\n\r\n```text\r\nMCP Client -> archery-query-mcp -> Archery Web Gateway -> Database\r\n```\r\n\r\n本项目不直连数据库。\n\nKafka 查询路径为：\n\n```text\nMCP Client -> archery-query-mcp --service kafka -> Kafka Query Tool -> Kafka\n```\n\r\n## 功能特性\r\n\r\n- 只允许只读 SQL：`SELECT`、`SHOW`、`EXPLAIN`。\r\n- 阻止写入、DDL、多语句、会话切换和文件导出类操作。\r\n- 对缺少 `LIMIT` 的 `SELECT` 自动追加限制。\r\n- 日常低风险只读查询支持单次调用；高风险或显式审阅场景保留 prepare / execute 两阶段流程。\r\n- 支持表结构读取和查询历史检索。\r\n- 支持 `hangzhou`、`beijing`、`huawei` 三个 Archery 云别名。\r\n- 支持业务组 scope 解析、绑定、切换、查看、清除和临时覆盖。\r\n- 支持按 `companyId` 路由到共享库、公司库、schema 映射或混合路由。\r\n- 支持 stdio 本地子进程模式和 HTTP `/mcp` 模式。\n- 使用 `--service kafka` 启动独立的只读 Kafka Query MCP，支持集群、Topic、消息分页和 companyId 分布查询。\n\r\n## 环境要求\r\n\r\n- Node.js `>= 20`\r\n- npm\r\n- 当前网络能访问目标 Archery 网关\r\n\r\n## 安装\r\n\r\n推荐全局安装：\r\n\r\n```bash\r\nnpm install -g @dezhouzhang/archery-query-mcp\r\n```\r\n\r\n验证命令是否可用：\r\n\r\n```bash\r\narchery-query-mcp --help\r\n```\r\n\r\n也可以不安装，直接用 `npm exec` 临时运行：\r\n\r\n```bash\r\nnpm exec --yes --package=@dezhouzhang/archery-query-mcp -- archery-query-mcp --help\r\n```\r\n\r\n查看版本：\r\n\r\n```bash\r\narchery-query-mcp -v\r\n```\r\n\r\n检查当前进程能否看到 Node、CLI 入口和必需环境变量：\r\n\r\n```bash\r\narchery-query-mcp doctor\r\n```\r\n\r\n`doctor` 只报告 `MCP_ARCHERY_LOGIN_USERNAME` / `MCP_ARCHERY_LOGIN_PASSWORD` 是否存在，不会输出账号或密码值。路径字段会把当前用户 home 目录显示为 `~`。\n\n启动独立 Kafka Query MCP：\n\n```bash\narchery-query-mcp --service kafka --transport stdio\n```\n\n默认 `--service archery`，现有 Archery 配置无需修改。Kafka 模式只支持 stdio，且只暴露\n`kafka_*` 工具；Archery 模式不暴露 Kafka 工具。\n\r\n从源码目录本地安装时，不要直接对未构建的源码目录执行 `npm install -g .`；先安装开发依赖并构建：\r\n\r\n```bash\r\nnpm ci\r\nnpm run build\r\nnpm install -g .\r\n```\r\n\r\n升级到最新版本：\r\n\r\n```bash\r\narchery-query-mcp upgrade\r\n```\r\n\r\n## 发布到 npm\r\n\r\n正式发布由维护者本地执行，使用 npm Access Token 无交互认证，不运行 `npm login`，\r\n因此不会依赖一次性的浏览器授权链接。\r\n\r\n### 一次性配置\r\n\r\n1. 在 npm 创建仅允许发布 `@dezhouzhang/archery-query-mcp` 的 Granular Access Token，\r\n   权限设为 Read and write，并启用 Bypass 2FA。\r\n2. 把 Token 写入当前用户的 npm 配置，不要写入项目仓库：\r\n\r\n```bash\r\nnpm config set //registry.npmjs.org/:_authToken \"YOUR_NPM_TOKEN\" --location=user\r\nnpm whoami\r\nnpm token list --json\r\n```\r\n\r\n确认 `npm whoami` 返回发布账号，并且当前 Token 的 `bypass_2fa` 为 `true`。Token 保存在\r\n当前用户的 `~/.npmrc` 中，严禁提交该文件或把 Token 写入 README、脚本和 GitLab 仓库。\r\nToken 到期后只需在 npm 网站和本机用户配置中轮换。\r\n\r\n### 日常发布\r\n\r\n先同步更新 `package.json` 和 `package-lock.json` 中的版本并运行：\r\n\r\n```bash\r\nnpm run release:check\r\nnpm publish --access public\r\n```\r\n\r\n`prepublishOnly` 会再次执行类型检查和测试，`prepare` 会重新构建发布文件。发布成功后再提交\r\n版本变更并创建对应 Git 标签。发布失败且版本未进入 npm registry 时，可以修复认证后重试；\r\n如果版本已经存在，则必须提升版本号。\r\n\r\n## 凭证配置\n\r\nArchery 登录账号密码只从运行时环境变量读取：\r\n\r\n```bash\r\nMCP_ARCHERY_LOGIN_USERNAME=your-user\r\nMCP_ARCHERY_LOGIN_PASSWORD=your-password\n```\n\n从禅道等明确账号证据定位公司时，受限工具使用独立的可选凭据：\n\n```bash\nMCP_ARCHERY_ACCOUNT_LOOKUP_USERNAME=your-restricted-user\nMCP_ARCHERY_ACCOUNT_LOOKUP_PASSWORD=your-restricted-password\n```\n\n该凭据只用于固定认证中心实例、`ihr360_auth_center.ac_account` 的精确账号查询，\n不会替代普通 Archery 登录凭据。\n\r\n不要把密码、Cookie、CSRF、session、SQL API token、数据库凭证写入仓库或共享配置文件。\n\nKafka Query 模式使用独立环境变量：\n\n```bash\nMCP_KAFKA_QUERY_USERNAME=your-user\nMCP_KAFKA_QUERY_PASSWORD=your-password\n```\n\nKafka 登录 Cookie 仅保存在对应 MCP 进程内存中，不读取浏览器 Cookie，也不会返回给 AI。\n\r\n为减少多个 MCP 子进程重复登录，macOS/Linux 默认把 Archery Session 缓存在\r\n`~/.cache/archery-query-mcp`，有效期默认 12 小时。缓存文件包含可复用的登录 Cookie，\r\n只应保存在当前用户私有目录中。Windows 无法通过 Node.js 的 POSIX mode 参数可靠设置\r\nowner-only ACL，因此默认只使用进程内缓存，不写入磁盘。\r\n\r\n需要显式配置或关闭磁盘缓存时使用：\r\n\r\n```bash\r\nARCHERY_SESSION_CACHE_DIR=/private/path/archery-query-mcp\r\nARCHERY_SESSION_CACHE_TTL_HOURS=12\r\n```\r\n\r\n设置 `ARCHERY_SESSION_CACHE_DIR=off` 可在所有平台关闭磁盘缓存。Windows 只有显式提供\r\n`ARCHERY_SESSION_CACHE_DIR` 时才会启用磁盘缓存，配置目录的访问权限由使用者负责。\r\n\r\n### macOS / Linux\r\n\r\n```bash\r\nexport MCP_ARCHERY_LOGIN_USERNAME=\"your-user\"\r\nexport MCP_ARCHERY_LOGIN_PASSWORD=\"your-password\"\r\n```\r\n\r\n### Windows PowerShell\r\n\r\n当前终端临时生效：\r\n\r\n```powershell\r\n$env:MCP_ARCHERY_LOGIN_USERNAME=\"your-user\"\r\n$env:MCP_ARCHERY_LOGIN_PASSWORD=\"your-password\"\r\n```\r\n\r\n写入当前 Windows 用户环境变量：\r\n\r\n```powershell\r\nsetx MCP_ARCHERY_LOGIN_USERNAME \"your-user\"\r\nsetx MCP_ARCHERY_LOGIN_PASSWORD \"your-password\"\r\n```\r\n\r\n使用 `setx` 后，需要重新打开终端或重启客户端进程。\r\n\r\n## 运行方式\r\n\r\n### stdio 模式\r\n\r\nstdio 模式适合 OpenCode、Codex 等客户端自动拉起 MCP 子进程：\r\n\r\n```bash\r\narchery-query-mcp --transport stdio\r\n```\r\n\r\n### HTTP 模式\r\n\r\nHTTP 模式适合多个客户端共享同一个 MCP 服务：\r\n\r\n```bash\r\narchery-query-mcp --transport http --port 8080\r\n```\r\n\r\nHTTP 默认绑定 `127.0.0.1`，不会监听所有网卡。如果确实要开放给内网网关或容器网络，可以显式指定：\r\n\r\n```bash\r\narchery-query-mcp --transport http --host 0.0.0.0 --port 8080\r\n```\r\n\r\nHTTP endpoints：\r\n\r\n```text\r\nPOST   /mcp   MCP JSON-RPC（tools/call 等）\r\nGET    /mcp   可选的 SSE 通知流\r\nDELETE /mcp   结束一个 MCP 会话\r\nGET    /health\r\n```\r\n\r\n`/mcp` 走标准的 MCP Streamable HTTP 协议：客户端先 `POST initialize`，服务端在响应里返回 `Mcp-Session-Id` 头，后续所有请求都要带上这个头，属于同一个会话。会话内多次调用的 scope 绑定会复用；不同 `Mcp-Session-Id` 之间互相隔离。请求还需带 `Accept: application/json, text/event-stream`。`DELETE /mcp`（带会话头）用于显式结束会话。\r\n\r\n共享 HTTP 部署建议配置 API Key：\r\n\r\n```bash\r\nexport ARCHERY_MCP_HTTP_API_KEY=\"replace-with-a-long-random-token\"\r\narchery-query-mcp --transport http --port 8080\r\n```\r\n\r\n客户端请求 `/mcp` 时需带：\r\n\r\n```text\r\nAuthorization: Bearer replace-with-a-long-random-token\r\n```\r\n\r\n`/health` 用于健康检查，不要求 Bearer token。不要把 HTTP API Key 写进仓库；如果未配置 `ARCHERY_MCP_HTTP_API_KEY`，请只在本机、可信内网或受可信网关保护的环境中使用，不要直接暴露到公网。\r\n\r\n## OpenCode stdio 配置\r\n\r\n先全局安装：\r\n\r\n```bash\r\nnpm install -g @dezhouzhang/archery-query-mcp\r\n```\r\n\r\n在启动 OpenCode 前，确保 `MCP_ARCHERY_LOGIN_USERNAME` 和 `MCP_ARCHERY_LOGIN_PASSWORD` 已经在 OpenCode 进程环境中可见。\r\n\r\n在 `~/.config/opencode/opencode.json` 中添加：\r\n\r\n```json\r\n{\r\n  \"mcp\": {\r\n    \"archery_query\": {\r\n      \"type\": \"local\",\r\n      \"command\": [\"archery-query-mcp\", \"--transport\", \"stdio\"],\r\n      \"enabled\": true,\r\n      \"timeout\": 30000\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nstdio 模式下，每个 OpenCode 进程通常会启动一个独立的 MCP 子进程，不会跨 OpenCode 实例复用。若希望多个 OpenCode 共享同一个 MCP，请使用 HTTP 模式并配置 remote MCP。\r\n\r\n## Codex stdio 配置\r\n\r\n先全局安装：\r\n\r\n```bash\r\nnpm install -g @dezhouzhang/archery-query-mcp\r\n```\r\n\r\n在启动 Codex 前，确保环境变量已设置：\r\n\r\n```bash\r\nexport MCP_ARCHERY_LOGIN_USERNAME=\"your-user\"\r\nexport MCP_ARCHERY_LOGIN_PASSWORD=\"your-password\"\r\n```\r\n\r\n在 `~/.codex/config.toml` 中添加：\r\n\r\n```toml\r\n[mcp_servers.archery_query]\r\ncommand = \"archery-query-mcp\"\r\nargs = [\"--transport\", \"stdio\"]\r\nenabled = true\r\nstartup_timeout_sec = 30\r\ntool_timeout_sec = 120\r\nenv_vars = [\"MCP_ARCHERY_LOGIN_USERNAME\", \"MCP_ARCHERY_LOGIN_PASSWORD\"]\r\n```\r\n\r\nmacOS 上如果 Codex 从 GUI 启动后找不到命令，先在终端执行 `command -v archery-query-mcp`，再把 `command` 改成输出的绝对路径。\r\n\r\n如果不想全局安装，也可以使用 `npm exec`：\r\n\r\n```toml\r\n[mcp_servers.archery_query]\r\ncommand = \"npm\"\r\nargs = [\"exec\", \"--yes\", \"--package=@dezhouzhang/archery-query-mcp\", \"--\", \"archery-query-mcp\", \"--transport\", \"stdio\"]\r\nenabled = true\r\nstartup_timeout_sec = 30\r\ntool_timeout_sec = 120\r\nenv_vars = [\"MCP_ARCHERY_LOGIN_USERNAME\", \"MCP_ARCHERY_LOGIN_PASSWORD\"]\r\n```\r\n\r\n修改 `config.toml` 后需要重启 Codex。\r\n\r\n## Archery 认证模式\r\n\r\n默认认证模式是 `simulated-login`：\r\n\r\n```bash\r\narchery-query-mcp --archery-auth-mode simulated-login\r\n```\r\n\r\n该模式会使用运行时环境变量 `MCP_ARCHERY_LOGIN_USERNAME` / `MCP_ARCHERY_LOGIN_PASSWORD` 登录 Archery。`huawei` 目前使用 HTTP base URL，但仍可走 simulated-login；只是请确保它运行在可信内网或可信网关后面，不要直接暴露给公网。\r\n\r\n## 支持的云\r\n\r\n| cloudName | 别名 | 说明 |\r\n| --- | --- | --- |\r\n| `hangzhou` | `hz`、`杭州云` | 杭州 Archery |\r\n| `beijing` | `bj`、`北京云` | 北京 Archery |\r\n| `huawei` | `hw`、`华为云` | 华为 Archery，默认登录模式受 HTTP 限制 |\r\n\r\n查询 scope 可以显式传入物理 Archery 目标，也可以通过业务组和 `companyId` 解析，也可以复用当前 session 绑定。\r\n\r\n## Scope 工作流\r\n\r\nscope 的目标是先确定当前查询属于哪个业务组，再根据公司路由规则得到安全的物理 Archery 目标。本服务仍然只通过 Archery 网关访问数据库，不会直连数据库。\r\n\r\n### 解析优先级\r\n\r\n普通查询工具会按以下顺序解析 scope：\r\n\r\n1. 本次调用显式传入 `cloudName`、`instanceName`、`dbName`。\r\n2. 本次调用显式传入 `businessGroupId`，必要时再传 `companyId`。`company-db` 业务复用公司路由规则，`schema-map` 业务必须落到公司真实存在的业务库。\r\n3. 本次调用只传入 `companyId` 时，`archery_query_readonly` / `archery_prepare_query` 只使用 SQL 中真实的表/schema identifier 做确定性兜底，并和公司真实 `availableBusinesses` 校验；自然语言业务语义由 AI 主判。\r\n4. 当前 `bindingDomainId` 下有效的临时覆盖。\r\n5. 当前 `bindingDomainId` 下有效的 session 绑定。\r\n6. 无法安全确定时返回候选或拒绝结果，让用户选择。\r\n\r\n显式物理 scope 只对本次调用生效，不会写入持久绑定。显式物理 scope 必须一次性提供完整的 `cloudName`、`instanceName`、`dbName`；只提供其中一部分会返回结构化的 `needs_user_input`，不会让客户端猜测缺失字段。普通的 prepare、describe、history 工具不会自动改写 session scope。\r\n\r\n### ScopeRequestContext 字段\r\n\r\nscope 相关工具和普通查询工具都可以携带这些上下文字段：\r\n\r\n| 字段 | 说明 |\r\n| --- | --- |\r\n| `sessionId` | 调用方的会话标识。HTTP 下取自 MCP 会话（`initialize` 握手返回的 `Mcp-Session-Id` 头），由服务端权威设定并注入到每个工具，不接受工具参数覆盖；stdio 未传时由服务进程生成默认会话。 |\r\n| `userSubject` | 当前 MCP 用户标识，未传时使用服务启动参数中的用户。 |\r\n| `workspaceRoot` | 当前工作区根目录。用于计算绑定域；普通查询和 `archery_resolve_scope` 不会因为它自动扫描工作区配置。 |\r\n| `activeFilePath` | 当前正在处理的文件路径。用于计算最近模块绑定域；AI 可以用它理解业务，但 MCP 不根据路径自动选择业务组。 |\r\n| `activeModuleRoot` | 当前模块根目录。用于绑定域；AI 可以用它理解业务，但 MCP 不根据路径自动选择业务组。 |\r\n| `businessGroupId` | AI 根据完整用户、Bug 和代码上下文主判出的 canonical 逻辑业务组。与 `companyId` 一起用于公司路由；共享库业务组可不传 `companyId`。 |\r\n| `companyId` | 公司 ID。和显式 `businessGroupId` 一起用于公司路由；没有业务组时，MCP 只根据强 SQL identifier 兜底，没有唯一结果就返回公司真实可选业务。 |\r\n| `cloudName`、`instanceName`、`dbName` | 显式物理 Archery scope，优先级最高，只用于本次调用。 |\r\n| `allowMultiScope` | 只影响路由层是否返回多目标候选。普通 prepare 仍只支持一个物理目标。默认不允许。 |\r\n\r\n服务会用 `sessionId`、规范化后的 `workspaceRoot` 和最近模块根目录计算 `bindingDomainId`。同一个用户在不同仓库、不同模块或不同会话中的绑定不会互相覆盖。没有 `workspaceRoot` 时，只能创建 session 本地的手动域，后续复用需要显式 bind 或 switch。\r\n\r\n### 业务组注册表和 companyId 路由\r\n\r\n业务组来自显式注册表，不从测试、表名或单个样例 SQL 猜测。注册表为每个业务组维护：\r\n\r\n- `businessGroupId` 和显示名称。\r\n- 面向 AI 的业务说明、自然语言意图词和 SQL identifier 词。\r\n- 路由模式：`shared-db`、`company-db`、`schema-map` 或 `hybrid`。\r\n- Archery `cloudName`、`instanceName`，以及可选默认 `dbName`。\r\n- 可识别的数据源别名、数据库名模式、schema 名模式。\r\n- 支持的业务类型，以及可选公司 schema 映射键或公司库命名模式。\r\n\r\n路由模式含义：\r\n\r\n| 模式 | 行为 |\r\n| --- | --- |\r\n| `shared-db` | 业务组固定到一个共享数据库，通常不需要 `companyId`。 |\r\n| `company-db` | `companyId` 参与数据库名解析。 |\r\n| `schema-map` | 先解析公司位置，再从公司映射中选择业务 schema。 |\r\n| `hybrid` | 可能同时涉及共享库和公司映射。若得到多个物理目标，默认返回 ambiguous；设置 `allowMultiScope` 只允许路由层返回多目标候选，不表示普通 prepare 可以执行多目标查询。 |\r\n\r\n`archery_query_readonly` 是推荐的 AI 查询入口：AI 先根据完整上下文选择 canonical `businessGroupId`，再传入 `companyId`、`businessGroupId`、`bugContext`、`sql`、`maxRows` 和必要的工作区上下文。它在内部复用 prepare/execute；普通低风险只读查询会直接执行，需要确认时只返回 prepared query 和下一步指引。仅当用户明确要求审阅或冻结 SQL 且不执行时，AI 才主动调用 `archery_prepare_query`；该工具同时保留给旧客户端兼容调用。\n\r\n自动选择规则：\r\n\r\n- 显式 `businessGroupId` 且公司路由能得到唯一物理目标：允许 prepare。`company-db` 业务通过公司库命名规则解析；`schema-map` 业务必须存在于 `availableBusinesses` 且具备 `instanceName`。\r\n- 没有显式业务组，但 SQL 表/schema identifier 唯一命中注册业务且该业务存在并且 query-ready：允许 prepare。\r\n- 杭州 `company_schema_lookup` 返回的 RDS ID / RDS 名称只作为实例匹配证据；服务会再用 `user_all_instances` 结果匹配真正的 Archery `instanceName`。如果匹配不到实例，该业务会以 `queryReady: false` 暴露给调用方，但不会自动 prepare。\r\n- SQL 没有唯一强业务 identifier 时，不会扫描自然语言或 workspace 配置兜底；有 `companyId` 时返回公司真实可选业务，让用户选择 `businessGroupId`。\r\n- `activeFilePath`、`activeModuleRoot`、`nearestModuleRoot` 只用于绑定域和帮助 AI 理解当前代码，不参与 MCP 自动业务选择。\r\n- 多个候选、弱证据或没有业务意图：返回 `needs_user_input`，并给出 `availableBusinesses` / `candidates`。\r\n- 业务意图明确但公司没有该业务库：返回 `business_not_available`。\r\n- 公司云、实例或映射不确定：返回 `needs_user_input`，不会 fuzzy 绑定实例。\r\n\r\n### 下一版本迁移说明\r\n\r\n本次路由调整移除了 MCP 根据 `bugContext`、文件路径和 workspace 配置自动选择业务组的行为，属于调用语义变更，建议作为 `0.4.0` 发布。旧客户端如果只传 `companyId + bugContext + SQL`，应改为：\r\n\r\n- AI 根据完整会话和代码上下文传入 canonical `businessGroupId`；\r\n- 无法确定时省略 `businessGroupId`，并处理 `needs_user_input` / `availableBusinesses`；\r\n- 不要依赖 `bugContext` 或 workspace 路径自动授权物理 scope。\r\n\r\n旧的 `archery_resolve_company_location` 仍可单独根据 `companyId` 查看公司品牌、云和业务 schema 映射。`archery_resolve_scope`、`archery_bind_business_group` 和 `archery_switch_business_group` 保留用于人工预检和显式绑定，但 AI 默认不需要先调用它们来猜 scope。\r\n\r\n### 绑定、切换、查看和清除\r\n\r\n常用用户流程：\r\n\r\n1. 调用 `archery_resolve_scope` 查看当前上下文能解析到什么。该工具不修改绑定。\r\n2. 若返回唯一可信业务组，或用户已知道业务组，调用 `archery_bind_business_group` 绑定当前 `bindingDomainId`。\r\n3. 如果要切换到另一个业务组，调用 `archery_switch_business_group`。切换只影响当前绑定域。\r\n4. 调用 `archery_show_scope` 查看当前持久绑定和临时覆盖。\r\n5. 调用 `archery_clear_scope` 清除当前绑定域的持久绑定和临时覆盖。\r\n6. 需要一次性跨业务查询时，调用 `archery_set_temporary_scope` 设置临时覆盖。\r\n\r\n`archery_bind_business_group` 和 `archery_switch_business_group` 会根据 `businessGroupId` 和可选 `companyId` 路由到物理 scope，然后把结果绑定到当前域。共享库业务组可以只传 `businessGroupId`；公司库、schema 映射和混合业务通常需要同时传 `companyId`。\r\n\r\n### 临时覆盖\r\n\r\n`archery_set_temporary_scope` 可设置一次性或限时覆盖，适合临时跨业务、临时跨公司或手动指定物理库的查询。参数可以是：\r\n\r\n- `businessGroupId`，可选 `companyId`。\r\n- 或显式 `cloudName`、`instanceName`、`dbName`。\r\n- `mode`: `one_query` 或 `time_boxed`。\r\n- `expiresInSeconds`: `time_boxed` 时的有效秒数，未传时使用默认有效期。\r\n\r\n临时覆盖优先于 session 绑定，但低于本次调用显式传入的物理 scope 或业务组路由。`one_query` 覆盖在一次安全查询解析后消费，过期覆盖不会继续生效，也不会变成默认绑定。\r\n\r\n### 工作区上下文\r\n\r\n`workspaceRoot`、`activeFilePath` 和 `activeModuleRoot` 仍可传给工具，用于隔离不同会话、仓库和模块的绑定域。普通查询和 `archery_resolve_scope` 不会因为传入 `workspaceRoot` 就扫描本地配置文件，也不会用本地 datasource 配置自动选择线上业务组。\r\n\r\n路径字段的使用边界：\r\n\r\n- `workspaceRoot` 参与 `bindingDomainId` 计算，避免一个 session 在不同项目或模块间复用错误绑定。\r\n- `activeFilePath`、`activeModuleRoot`、`nearestModuleRoot` 可帮助 AI 理解当前代码业务，但 MCP 不根据路径自动选择业务组。\r\n- MCP 只根据 SQL 中真实的表/schema identifier 做自动业务兜底，不会根据路径生成 `businessGroupId`、`dbName` 或 `instanceName`。\r\n- SQL identifier 无法唯一确定业务时，系统会直接返回 `needs_user_input` / `missing_scope`，让调用方补充 canonical `businessGroupId` 或显式物理 scope。\r\n\r\n### 安全查询解析\r\n\r\n`archery_query_readonly`、`archery_prepare_query`、`archery_describe_table` 和 `archery_query_history` 都会先解析安全物理 scope，再访问 Archery。以下情况会在访问 Archery 前拒绝：\r\n\r\n- scope 缺失。\r\n- 当前 session 绑定属于另一个 `bindingDomainId`。\r\n- 业务组不支持或公司路由缺少必要数据。\r\n- 混合路由得到多个目标且本次调用没有设置 `allowMultiScope`。\r\n- 混合路由得到多个目标且本次调用设置了 `allowMultiScope`：普通 prepare 仍会返回 `multi_target_execution_unsupported`。\r\n\r\n`archery_execute_query` 不会重新检测工作区，也不会改写 scope。它只执行 prepare 阶段已经捕获的物理 scope。\r\n\r\n普通 prepare 当前只捕获并执行一个物理 Archery 目标。多目标 hybrid 查询的 fan-out、结果合并、确认 token 和失败语义尚未定义，因此故意不支持可执行的多目标 prepare；在显式 fan-out 语义实现前，`allowMultiScope` 仅用于路由层发现候选。\r\n\r\n当系统能给出候选但不能安全选择时，会返回候选列表和 rejected 或 ambiguous 状态，用户应调用 `archery_bind_business_group`、`archery_switch_business_group` 或 `archery_set_temporary_scope` 明确选择后再查询。\r\n\r\n查询前必须得到 query-ready scope：`cloudName + instanceName + dbName`。该 scope 只能来自安全解析结果，或来自用户明确输入的完整物理 scope。客户端不应从代码、JDBC URL、DataGrip、表名或历史样例中猜测 Archery `instanceName` / `dbName`。\r\n\r\n## 查询策略配置\r\n\r\n可以通过环境变量调整查询策略：\r\n\r\n| 环境变量 | 默认值 | 说明 |\r\n| --- | --- | --- |\r\n| `ARCHERY_QUERY_DEFAULT_LIMIT` | `100` | 未传 `limitNum` 或传入小于等于 0 时使用的默认 LIMIT |\r\n| `ARCHERY_QUERY_MAX_LIMIT` | `500` | 最大允许 LIMIT |\r\n| `ARCHERY_QUERY_REQUIRE_CONFIRMATION` | `true` | staged execute 是否强制提供确认 token，保留旧客户端默认安全语义 |\r\n| `ARCHERY_QUERY_AUTO_EXECUTE_LOW_RISK` | `true` | `archery_query_readonly` 是否在当前调用内自动执行低风险只读查询 |\r\n| `ARCHERY_QUERY_ALLOWED_INSTANCES` | 空 | 逗号分隔的实例白名单，空表示不限制 |\r\n| `ARCHERY_QUERY_ALLOWED_DATABASES` | 空 | 逗号分隔的数据库白名单，空表示不限制 |\r\n| `ARCHERY_QUERY_BLOCKED_TABLES` | 空 | 逗号分隔的禁止访问表名或限定表名，按 SQL identifier 精确匹配 |\r\n| `ARCHERY_MCP_HTTP_API_KEY` | 空 | HTTP `/mcp` Bearer token，空表示不启用内置 HTTP 鉴权 |\r\n\r\n示例：\r\n\r\n```bash\r\nexport ARCHERY_QUERY_DEFAULT_LIMIT=50\r\nexport ARCHERY_QUERY_MAX_LIMIT=200\r\nexport ARCHERY_QUERY_REQUIRE_CONFIRMATION=true\r\nexport ARCHERY_QUERY_AUTO_EXECUTE_LOW_RISK=true\r\n```\r\n\r\n## MCP 工具\r\n\r\n除 `archery_execute_query` 外，查询和 scope 工具都可携带 `ScopeRequestContext` 字段，例如 `workspaceRoot`、`activeFilePath`、`activeModuleRoot`、`businessGroupId`、`companyId` 和 `allowMultiScope`。`sessionId` / `userSubject` 仅用于无 transport 的兼容调用；HTTP/stdio 下始终以 MCP transport session 和服务端认证用户为准。普通查询工具也继续接受显式 `cloudName`、`instanceName`、`dbName`，用于本次调用的最高优先级物理 scope。\r\n\r\n### `archery_query_readonly`\r\n\r\n日常 AI 查数主入口。AI 根据完整会话、Bug 和代码上下文判断业务后，输入 `companyId`、canonical `businessGroupId`、`bugContext`、`sql` 和可选的统一 `maxRows`。如果业务不明确则省略 `businessGroupId`，MCP 只根据 SQL relation identifier 做确定性兜底。工具内部完整复用 scope 解析、SQL policy、LIMIT、prepare store 和 execute；省略 `maxRows` 时使用 `ARCHERY_QUERY_DEFAULT_LIMIT`。\r\n\r\n- `riskLevel=low` 且启用 `ARCHERY_QUERY_AUTO_EXECUTE_LOW_RISK` 时，在一次工具调用内执行，顶层直接返回 `status`、`rows`、`columns`、`durationMs` 等执行结果。\r\n- 查询被阻止或 scope 不明确时，返回与 prepare 相同的结构化错误。\r\n- 查询为 medium risk、关闭自动执行或需要确认时不执行，保留 `prepareId` 并返回 `nextAction: \"archery_execute_query\"`。\r\n- 直接执行完成后清理内部 prepared query，避免长期积累。\r\n\r\n风险分级面向只读 Archery 场景做了收敛：普通排序、`DISTINCT`、常规 JOIN，以及不超过最大行数限制的顶层汇总聚合和 `GROUP BY/HAVING` 均为 `low`，可走一次调用。显式大结果上限的明细查询、窗口函数、CTE/子查询、`UNION`、`CROSS JOIN` 和 `EXPLAIN ANALYZE` 仍为 `medium`，保留分阶段执行。\n\r\n### `archery_prepare_query`\r\n\r\n先解析安全物理 scope，再校验只读 SQL，补齐 LIMIT，计算 SQL hash，并返回 `prepareId` 和确认 token 提示。\r\n\r\n成功时返回 `status: \"ok\"`，并包含：\r\n\r\n- `prepareId`\r\n- `normalizedSql`\r\n- `riskLevel`\r\n- `requiresConfirmation`\r\n- `policyFindings`\r\n- `confirmationToken`\r\n- `sqlHash`\r\n- `scope`: 本次 prepare 捕获的 query-ready scope，包含 `cloudName`、`instanceName`、`dbName`\r\n- `businessGroupId`: 本次路由使用的 canonical 业务组；显式传入、自动 SQL fallback、session binding 和 temporary override 都统一返回 canonical ID\r\n- `target`: 通过 TargetResolver 自动解析时返回的 query-ready scope\r\n- `evidence`: TargetResolver 路由证据，例如显式 canonical 业务组、SQL relation identifier 和 `availableBusinesses` 中的真实库名\r\n- `confirmationSummary`\r\n\r\n`companyId` + canonical 业务组解析成功示例：\r\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"businessGroupId\": \"attendance\",\r\n  \"target\": {\r\n    \"cloudName\": \"beijing\",\r\n    \"instanceName\": \"schysc_四川宏远上城超市有限公司\",\r\n    \"dbName\": \"schysc_attendance_amazon\"\r\n  },\r\n  \"evidence\": [\r\n    { \"source\": \"explicitBusinessGroup\", \"value\": \"attendance\", \"confidence\": 1 },\r\n    { \"source\": \"availableBusiness\", \"value\": \"schysc_attendance_amazon\", \"confidence\": 1 }\r\n  ],\r\n  \"confirmationToken\": \"CONFIRM:...\"\r\n}\r\n```\r\n\r\n如果 scope 解析失败，`archery_prepare_query` 不会访问 Archery，也不会抛出传输层错误；它会返回 `status: \"needs_user_input\"`、`prepareId: null`、`requiresConfirmation: false` 和结构化 `scopeError`：\r\n\r\n```json\r\n{\r\n  \"code\": \"missing_schema_mapping\",\r\n  \"message\": \"...\",\r\n  \"known\": { \"companyId\": \"...\", \"businessGroupId\": \"...\" },\r\n  \"missing\": [\"cloudName\", \"instanceName\", \"dbName\"],\r\n  \"availableBusinesses\": [\r\n    { \"businessGroupId\": \"attendance\", \"dbName\": \"schysc_attendance_amazon\" },\r\n    {\r\n      \"businessGroupId\": \"workflow\",\r\n      \"dbName\": \"prod_workflow_region1023\",\r\n      \"source\": \"company_schema_lookup\",\r\n      \"rdsId\": \"rm-bp11266408d5u32i7\",\r\n      \"rdsName\": \"考勤新分区库-4\",\r\n      \"queryReady\": false,\r\n      \"missing\": [\"instanceName\"]\r\n    },\r\n    { \"businessGroupId\": \"payroll\", \"dbName\": \"schysc_payroll_amazon\" }\r\n  ],\r\n  \"candidates\": [\r\n    { \"businessGroupId\": \"attendance\", \"confidence\": 0.9 }\r\n  ],\r\n  \"nextAction\": \"ask_user\",\r\n  \"userPrompt\": \"请提供查询所需的 cloudName / instanceName / dbName，不要从代码、JDBC 或 DataGrip 猜测 Archery scope。\"\r\n}\r\n```\r\n\r\n调用方应把 `scopeError.userPrompt` 或等价问题展示给用户。缺少完整物理 scope 时，`missing` 只列出未提供的物理字段；公司/业务组路由能列出真实业务库但不能安全自动选择时，`missing` 会要求 `businessGroupId` 并返回 `availableBusinesses`。不要从候选外生成 `dbName`。\r\n\r\n常见参数：\r\n\r\n- `bugContext`\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n- `businessGroupId`\r\n- `companyId`\r\n- `allowMultiScope`\r\n- `cloudName`\r\n- `instanceName`\r\n- `dbName`\r\n- `sql`\r\n- `limitNum`\r\n\r\n### `archery_execute_query`\r\n\r\n执行已 prepare 的查询。中风险查询或启用全局强制确认时需要传入 `confirmationToken`。\r\n\r\n常见参数：\r\n\r\n- `prepareId`\r\n- `confirmationToken`\r\n- `maxRows`\r\n\r\n### `archery_describe_table`\r\n\r\n先解析安全物理 scope，再通过 Archery 读取表结构元数据。\r\n\r\n常见参数：\r\n\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n- `businessGroupId`\r\n- `companyId`\r\n- `cloudName`\r\n- `instanceName`\r\n- `dbName`\r\n- `schemaName`\r\n- `tableName`\r\n\r\n### `archery_query_history`\r\n\r\n先解析安全物理 scope，再搜索 Archery 查询历史摘要，不返回历史结果数据。\r\n\r\n常见参数：\r\n\r\n- `search`\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n- `businessGroupId`\r\n- `companyId`\r\n- `cloudName`\r\n- `instanceName`\r\n- `dbName`\r\n- `limit`\r\n\r\n### `archery_resolve_scope`\r\n\r\n解析当前 scope 状态或显式业务组/company 路由，不修改持久绑定。适合在出现 scope 拒绝时查看已有绑定、预演显式业务组路由，或在只有 `companyId` 时获取公司真实可选业务。传入 `businessGroupId` 时，它会预演与 `archery_prepare_query` 相同的业务组/company 路由路径，避免预检结果和实际 prepare 不一致。\r\n\r\n常见参数：\r\n\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n- `businessGroupId`\r\n- `companyId`\r\n\r\n可能返回：\r\n\r\n- `resolved`: 已有显式、临时或 session scope 可用。\r\n- `rejected`: 存在过期、跨域或不安全状态。\r\n- `needs_user_input`: 已知上下文不足，返回 `scopeError`，调用方应询问用户补齐字段。\r\n\r\n### `archery_bind_business_group`\r\n\r\n把当前 `bindingDomainId` 绑定到一个业务组路由。绑定成功后，同一 session 和工作区模块内的普通查询可以复用该 scope。\r\n\r\n常见参数：\r\n\r\n- `businessGroupId`\r\n- `companyId`\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n\r\n### `archery_switch_business_group`\r\n\r\n把当前 `bindingDomainId` 切换到另一个业务组路由。它和 bind 一样显式写入当前域，但语义上用于用户主动切换。\r\n\r\n常见参数：\r\n\r\n- `businessGroupId`\r\n- `companyId`\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n\r\n### `archery_show_scope`\r\n\r\n查看当前 `bindingDomainId` 下的 session 绑定和临时覆盖。\r\n\r\n常见参数：\r\n\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n\r\n### `archery_clear_scope`\r\n\r\n清除当前 `bindingDomainId` 下的 session 绑定和临时覆盖，并让下一次查询重新解析 scope。\r\n\r\n常见参数：\r\n\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n\r\n### `archery_set_temporary_scope`\r\n\r\n设置一次性或限时临时覆盖。适合用户明确知道本次要跨业务或跨公司查询，但不希望改写默认绑定。\r\n\r\n常见参数：\r\n\r\n- `businessGroupId`\r\n- `companyId`\r\n- `cloudName`\r\n- `instanceName`\r\n- `dbName`\r\n- `mode`\r\n- `expiresInSeconds`\r\n- `sessionId`\r\n- `workspaceRoot`\r\n- `activeFilePath`\r\n- `activeModuleRoot`\r\n\r\n### `archery_resolve_company_location`\n\r\n根据 auth center 的 `companyId` 解析公司品牌、Archery 云和业务库映射。\r\n\r\n常见参数：\r\n\r\n- `companyId`\n\n返回示例：\n\r\n```json\r\n{\r\n  \"status\": \"ok\",\r\n  \"companyId\": \"...\",\r\n  \"brand\": \"prod\",\r\n  \"cloudName\": \"hangzhou\",\r\n  \"mappings\": [\r\n    {\r\n      \"businessType\": \"kpi\",\r\n      \"schemaName\": \"prod_kpi_region1017\",\r\n      \"isValid\": true\r\n    }\r\n  ],\r\n  \"message\": \"Company cloud and schema mappings resolved\"\r\n}\n```\n\n### `archery_resolve_company_by_account`\n\n根据明确提供的准确 `accountName` 查询关联 `usingCompanyId`。工具内部固定使用\n杭州云 `认证中心数据库-platform-2tables / ihr360_auth_center / ac_account`，调用方\n不能传入 SQL 或物理目标。每次调用使用独立凭据重新登录，不复用普通查询 Session。\n\n常见参数：\n\n- `account`\n\r\n### `archery_runtime_diagnostics`\r\n\r\n查看 MCP 进程实际看到的运行环境，适合排查 macOS GUI 启动后 PATH 或环境变量不一致的问题。该工具不会返回账号或密码原文，只返回 `present: true/false`；路径字段会把当前用户 home 目录显示为 `~`。\r\n\r\n常见返回字段：\r\n\r\n- `status`: `ok` 或 `warning`，聚合所有 `checks`\r\n- `runtime.nodeVersion`\r\n- `runtime.platform`\r\n- `runtime.argvEntry`\r\n- `environment.MCP_ARCHERY_LOGIN_USERNAME.present`\r\n- `environment.MCP_ARCHERY_LOGIN_PASSWORD.present`\n- `environment.MCP_ARCHERY_ACCOUNT_LOOKUP_USERNAME.present`\n- `environment.MCP_ARCHERY_ACCOUNT_LOOKUP_PASSWORD.present`\n\r\n## 推荐查询流程\r\n\r\n1. 日常 AI 查询先根据完整用户、Bug 和代码上下文主判 canonical `businessGroupId`，再调用 `archery_query_readonly`，传入 `companyId`、`businessGroupId`、`bugContext`、`sql`、`maxRows`。\r\n2. AI 无法确定业务时省略 `businessGroupId`；MCP 只使用强 SQL identifier 兜底。如果返回 `needs_user_input` 和 `availableBusinesses`，让用户选择，不要从 workspace 配置猜测。\r\n3. 如果要建立当前会话的默认业务域，调用 `archery_bind_business_group` 绑定用户确认的业务组。若系统返回多个候选，先让用户选择，再 bind 或 switch。\r\n4. 如果只是临时跨业务或跨公司查询，调用 `archery_set_temporary_scope`，不要改写默认绑定。\r\n5. `archery_query_readonly` 和 `archery_prepare_query` 都可以在本次调用中直接传完整的 `cloudName`、`instanceName`、`dbName`，或传 `businessGroupId` 和 `companyId`。\r\n6. 检查返回的 `normalizedSql`、`riskLevel`、`policyFindings`。若顶层包含 `executionId`，则查询已经执行，顶层 `status` 是 Archery 执行状态。\r\n7. 如果返回 `status: \"needs_user_input\"`，按 `scopeError.missing` / `scopeError.userPrompt` 询问用户补齐，不要猜测 Archery scope。\r\n8. 如返回 `nextAction: \"archery_execute_query\"`，由用户审阅 SQL 后再使用确认 token。\r\n9. 调用 `archery_execute_query` 并传入确认 token。\r\n10. 查看 `columns`、`rows`、`rowCount`、`effectiveMaxRows`、`truncated`、`durationMs`、`archeryMessage`。\r\n\r\n`truncated` 表示返回行数达到本次执行上限，语义是“可能还有更多行”。普通字段内容不会默认截断。\r\n\r\n## CLI 参数\r\n\r\n```text\r\n--transport <transport>       stdio 或 http，默认 stdio\r\n--host <host>                 HTTP 监听地址，默认 127.0.0.1\r\n--port <port>                 HTTP 端口，默认 8080\r\n--archery-auth-mode <mode>    simulated-login 或 personal-session\r\n--archery-client-mode <mode>  http-query 或 stub\r\n--query-path <path>           Archery 查询接口路径，默认 /query/\r\n--user <subject>              MCP 用户标识\r\n```\r\n\r\n## 常见问题\r\n\r\n### 找不到 `archery-query-mcp` 命令\r\n\r\n确认已全局安装，并且 npm 全局 bin 目录在 `PATH` 中：\r\n\r\n```bash\r\nnpm install -g @dezhouzhang/archery-query-mcp\r\ncommand -v archery-query-mcp\r\narchery-query-mcp --help\r\n```\r\n\r\nmacOS GUI 应用可能不继承终端里的 `PATH`。如果 OpenCode / Codex 从桌面启动后找不到命令，请在 MCP 配置里使用 `command -v archery-query-mcp` 输出的绝对路径，或改用上面的 `npm exec` 配置。\r\n\r\n### OpenCode / Codex 配置后不生效\r\n\r\n修改 MCP 配置后需要重启 OpenCode / Codex。stdio MCP 是由客户端启动的子进程，旧进程不会自动读取新配置。\r\n\r\n### 凭证未生效\r\n\r\n确认启动客户端的进程能读取到：\r\n\r\n```bash\r\nMCP_ARCHERY_LOGIN_USERNAME\r\nMCP_ARCHERY_LOGIN_PASSWORD\nMCP_ARCHERY_ACCOUNT_LOOKUP_USERNAME\nMCP_ARCHERY_ACCOUNT_LOOKUP_PASSWORD\n```\n\r\nWindows 使用 `setx` 后，需要重新打开终端或重启客户端。\r\n\r\n### 华为云登录失败\r\n\r\n`huawei` 当前是 HTTP URL，但 npm 版已允许 simulated-login 直接走该地址；请确保只在可信内网或可信网关后使用。\r\n\r\n## 维护者发布流程\r\n\r\n发布前运行 `npm run release:check`，确认当前用户 Token 已启用 Bypass 2FA，然后按照前文\r\n“发布到 npm”的本地无交互流程执行。不要运行 `npm login`。\r\n\r\n如果版本已发布，需要同时更新 `package.json` 和 `package-lock.json` 中的 `version`，\r\n并创建对应的新版本标签。\r\n","readmeFilename":"README.md"}