{"_id":"mcp-voice-hooks","_rev":"32-417456738b4ca025a19e20e46b8d4987","name":"mcp-voice-hooks","dist-tags":{"beta":"1.0.28-beta.1","latest":"1.0.42"},"versions":{"1.0.0":{"name":"mcp-voice-hooks","version":"1.0.0","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.0","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/yourusername/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/yourusername/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"d3375fc432f00be2d4b9234b8e169b78ca65c772","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.0.tgz","fileCount":19,"integrity":"sha512-Zlww+106OdhTaZgKhTdpkXFPhLKKaNV+k1C6C6E7e+FNKYA/MENEmd1dno7n83HWBbuN7tR9cU6ts+wvNouHwA==","signatures":[{"sig":"MEUCIBWnaCaQZohWw0cW+xqG6cUWEJZo1Kl47tMwapbdKj66AiEArLmamlW/FYPtiyesc0aY+5oJD/VYKQkOhGBZFlVBGK8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":96352},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"01a172462708e35934c7b4d98147fa09f2e05831","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.0_1751653734757_0.26602448679477386","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"mcp-voice-hooks","version":"1.0.1","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.1","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/yourusername/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/yourusername/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"69ec63df20d9cee8a5a417a43a0ce1b896494d26","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.1.tgz","fileCount":20,"integrity":"sha512-mO1jFYAuO6HQS9+vMhwVvgmQgkznCjebUj9opD3RoE/oHvEnbc7zTkaqF9UikP4TN9jcMUMmqSPZ+33D9Cv7mQ==","signatures":[{"sig":"MEUCIQCcnrSFNN4aW9cZLdtmjpobklDzrlOCM/r29y2sA2iI+QIgTXp5SJjFtpU2cHdClaZ8F6Ng+IWAUHRCmZXxA5cgz3Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":134273},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"b2c62435670564710e6afde8596026442836aba2","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.1_1751655445222_0.6134749543902658","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"mcp-voice-hooks","version":"1.0.2","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.2","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/yourusername/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/yourusername/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"ce0d981e729b08f978f63a972445490203536fd5","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.2.tgz","fileCount":29,"integrity":"sha512-xUnJKFph1KO/tIJf6V35uliEpqcXmMQFPXzYjjpGJFxwasQl8VnQNoyaUjxAeTRzIIv2UERU560M8GTq26OgDg==","signatures":[{"sig":"MEUCIF3Ym5RU3UATNop6J/i41HG4uNNiAHMH2lg5N6Yci4ZgAiEA/l5EMXSSm6NiZATYtLKv1jDdrFXiulUSSwCXjEzpj00=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":256084},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"006f0867b7d790ff8dbfd17c967d5ec865dc23fc","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.2_1751678814379_0.5656870338290334","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"mcp-voice-hooks","version":"1.0.6","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.6","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/yourusername/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/yourusername/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"f5016f2ad0bd8167ac6cbfc0100866bed1709eca","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.6.tgz","fileCount":32,"integrity":"sha512-xWD79g4+//Y5PsMa5/8sl0yba3QSYlLc+hW4IC9sYvmNAvv859RDUcTamez1RyFk5wmFuyVUECiXRObdRQS1Fg==","signatures":[{"sig":"MEQCIHP2VauDuCtjYQXXjB+y9UHymiStlUdBYuesHcxKQV09AiBGGYKj+6/PVs+ik81TkTVpncJjkqMgCtD2QGTT9inm4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269360},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"aa38569f69eb3d528a866cc44ec847f3b6927704","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.6_1751726568362_0.03112081089582608","host":"s3://npm-registry-packages-npm-production"}},"1.0.8":{"name":"mcp-voice-hooks","version":"1.0.8","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.8","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"d1d46024f1212a8e9dce31cfd45c860ae50b5848","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.8.tgz","fileCount":33,"integrity":"sha512-b8KJBMPoi0T+o56ryluGawBFAi2d7e7S7qmGs7uqBwFvH9xPEKEWMZr+xFkW412ftkTvKorAi0Pn3pLG15AZDw==","signatures":[{"sig":"MEYCIQDi+wH0tJ0NSQpPLXrwXM8pjWSi8xTmsolPkNbv8IV/LwIhAIkbpRbqbjeZDxhvlRrc6kyFms6K9Qi46Mo5Lbxu9v6z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287482},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"6d1b0925a7dbc6754b823c5430dc3e5d6b33de72","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.8_1751770188669_0.8726253304439078","host":"s3://npm-registry-packages-npm-production"}},"1.0.12":{"name":"mcp-voice-hooks","version":"1.0.12","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.12","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"523e45a4195f0d121f1d70166463a7c3699c0b76","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.12.tgz","fileCount":33,"integrity":"sha512-0tVIFXDY0Us+zxvrKFH9+2hDjHS38Qt58nNJ0EFzATc+bwwnJiD34Tn1auqECXJxlrBmo7xf6gv4dlKZoJ790Q==","signatures":[{"sig":"MEYCIQD3lFGqu1pPqLAlmFGigJO+cU34ylP5//sph+eKryEs6AIhAK1yuKbEM5aVt/9FIKGtXd+HlGy5HKfhUuo6/Yw5JvzE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":311601},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"38377358d83ef87f8add9762df89c5d9e7129450","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.12_1751973309158_0.7007599488678331","host":"s3://npm-registry-packages-npm-production"}},"1.0.13":{"name":"mcp-voice-hooks","version":"1.0.13","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.13","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"f710ea35de9fd27c5714326296db1895002a93ac","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.13.tgz","fileCount":17,"integrity":"sha512-hFpZI4/vhvwb7IOULloJ0aVMjQrOQaraKC2eM+pmMB9P7e8/skoFE7LjYXrGHFyMyWdjaanFzlYKfbOK15d5Ow==","signatures":[{"sig":"MEQCICpS9OECDh0ARrT9iy+/lQ/ZgvxembLNNkmp9Jv0H2K2AiAdr5Q2ql2njMDPL8c8pTncKwnz65Iqf3yhzSHFvDo9Qg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":130993},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"a1accd7ca89410e9e93aba4a7d30c0b9a8fbe117","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.7.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.13_1752013470787_0.715189992409111","host":"s3://npm-registry-packages-npm-production"}},"1.0.14":{"name":"mcp-voice-hooks","version":"1.0.14","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.14","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"9ca7769804fd4e0c1f238c78d0dcf174f8bb2514","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.14.tgz","fileCount":29,"integrity":"sha512-2uzdaf03z0VhzzOF43uJcJrfqi2ANAGAp48Os1FS0vBHi8CuTCQzKBAmI2Ljhjc1EsX+6CZ8c5/6xCXgi06txA==","signatures":[{"sig":"MEMCH2ENkXDKfqNS7J3uW1qKKc5sRbqHA25DEWiafSeORB8CIDhI6zUbgx+tANgu9DYwPURrmD88f77NwX1RZEY+rKo8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":309157},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"2afa6a53e3b58cd584817544e55f762a7c54df7d","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.14_1752072442930_0.638538839832945","host":"s3://npm-registry-packages-npm-production"}},"1.0.15":{"name":"mcp-voice-hooks","version":"1.0.15","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.15","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"3c758fff5aad26dc20f8ccddbe25c6903f9c367c","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.15.tgz","fileCount":29,"integrity":"sha512-kJVKvjYuzjmpfZr08SJzQV39I5fXvL3cWmT5+WfWnS00RSVNt1M1WJ7dF9T0woWXPjf7X2P9vrscUGuTFmnVPQ==","signatures":[{"sig":"MEQCIFjxJ5Ka1WbS8mcJT5cZObvYJHaDwK6B6mmoBvUQUz+tAiAjdiv93vNA0LwYxmVLUMrEgdVrfexnIpqN6/lR+Jmd3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":305527},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"afda79ead643151ec9066459049172ede1d06635","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.15_1752076319301_0.8161182887409388","host":"s3://npm-registry-packages-npm-production"}},"1.0.16":{"name":"mcp-voice-hooks","version":"1.0.16","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.16","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"3b3c3d0481dffc5a8fa4e7e6b77f64a6fdad6b1e","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.16.tgz","fileCount":29,"integrity":"sha512-NsS6d1FM4PdGCB3XHVWwejrFBnUDTvAVuBrQC+MdK0XRII0E8LIdEVRAALkkeHhSJd9AlT/qVbnK0ca6FMS6oQ==","signatures":[{"sig":"MEUCIQCWMF/qnrckorguoPZ3Iejc3qloym0aRjMbGTK/JPSjTAIgO46+9oS9vVm80M8SXtfh1WeSDxZ1vjA11ULMKGBqku8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":307566},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"5e60b56413fdc7025a5ec00a4d278f37596921ea","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.16_1752087229092_0.9722881904590248","host":"s3://npm-registry-packages-npm-production"}},"1.0.18":{"name":"mcp-voice-hooks","version":"1.0.18","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.18","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"a02e0328787af9376bee2169e82850dd7fc55ab9","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.18.tgz","fileCount":29,"integrity":"sha512-hSgY4cPXwHHnvGf2cnYEr2nzTPSqv4U34oojsytwyO5Hdl+Hv0Fyo5Pj60fASAn6Rl8pUsgakhuFRW1gnnTVaA==","signatures":[{"sig":"MEUCIH7XmgDS2r/DAJEUUNB8pyagps6Yp7i0fBgi0i3e+z3eAiEAuE9GY+YO4p8+39a8KcBcy1HxblIL+0tYKc5rjObUOww=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321303},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"dc2c34c35b33f66be98839c90c807b548fc5ca4a","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.18_1752144443689_0.938769375462865","host":"s3://npm-registry-packages-npm-production"}},"1.0.20":{"name":"mcp-voice-hooks","version":"1.0.20","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.20","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"d8aeca022892b8ce1f5315378c25503fa6629e37","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.20.tgz","fileCount":29,"integrity":"sha512-va2K+jR4RSKY8XKUIPxJWtzWzXwZAeZNA1ri5t75/owgJ+gVfOJ0pEWh1jlcVSwZqsVov9QsLlnYz+gBirG7gg==","signatures":[{"sig":"MEUCIECFMcdMFoaJNel3NzQ5N7o/9zAOxN7Dp3ncsfQXiorKAiEAiPpi+EYYShRb5mYxPlW8/YfoGZTR6Qvmuq7KM88hpUE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322781},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"c67b4b1438026b25b389140dbb0dd48f3d7c8c5f","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.20_1752146567014_0.7007687011320138","host":"s3://npm-registry-packages-npm-production"}},"1.0.21":{"name":"mcp-voice-hooks","version":"1.0.21","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.21","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"eda6ca641a240434ca2412537fdd266aa1220edc","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.21.tgz","fileCount":29,"integrity":"sha512-XVn+MIVB5MDeDbUK/FoMCwDPVoTseWBW9oyjldvREQekMynZ4YtGRANuIMwDNf1OgmZ+g4rkRKkoJl+SMzZcZw==","signatures":[{"sig":"MEYCIQDa7ycSWPbOuZW69yo5e6TlRzJpSxrJ6Wo26q4pF/CwfgIhALFUgOz5Aj8/X2UFA6ROfl3G+j94xZV2guSjSjssyxVb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":322802},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"a91e632d0535b8e01bd5bf3154f04d456700990e","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","actor":{"name":"johnmatthewtennant","type":"user","email":"johnmatthewtennant@gmail.com"},"email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.21_1752157189593_0.9262507725279763","host":"s3://npm-registry-packages-npm-production"}},"1.0.22":{"name":"mcp-voice-hooks","version":"1.0.22","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.22","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"54f0c8d8fbae683721075d74b0b8934de99d576f","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.22.tgz","fileCount":29,"integrity":"sha512-zOL/U/vHlnlaOJY3jidzW81dMyoLUb/hI/KX766hcTrxICinn2GO6adiolA30U+CTxkJOKURcMU4O7tuUvKEzA==","signatures":[{"sig":"MEYCIQD4ijtqvd9JfPiKxpOFswJJXTVyrQiEdaC2MjtnIfHC2AIhALAsS0UH1nXg4MwkfSgVJE5YrtTJnhUI+ruUzuP+FHqS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":324285},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"963ea3606c0ca2e0275138db015e3a6763ae6fe5","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.9.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"23.10.0","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.22_1752257690507_0.7065533292987394","host":"s3://npm-registry-packages-npm-production"}},"1.0.25":{"name":"mcp-voice-hooks","version":"1.0.25","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.25","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"f684bf18c487c21e7e478719154b42e95b20fd9b","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.25.tgz","fileCount":17,"integrity":"sha512-aYq2q6C0mkQ/gLfvpSMQochMvUfSmCq/VQs5jnwUqlVnTxLfDtJ+8X9REXqK05ytsNES0VqNDJ9TdE5WZ4VwRg==","signatures":[{"sig":"MEYCIQDGKQSTwO+nEPamUZrpvHa5251msDgsQjRwUnTUXKaXbgIhAMRasgvbnu92GP2otzV/uWjd32Z87CKmXqlpf8Wxl1/G","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":147484},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"ed2b84dab39a11a718bec6483f8d680e32f85200","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.3","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.25_1752261990156_0.5765197426903477","host":"s3://npm-registry-packages-npm-production"}},"1.0.26":{"name":"mcp-voice-hooks","version":"1.0.26","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.26","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"ab05b0bab1e41e707242d2909162fb9274801d0a","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.26.tgz","fileCount":17,"integrity":"sha512-Qfdt9sF686HXRTenO3WDL7nlABUtUU2gKzsbhWBSe4lYOZCjJK4pvlMf23Ak99gLsEAIC4xe2DHyOPfpznYOUQ==","signatures":[{"sig":"MEQCIGqfkl3W86J5QrVO6FziZJTp9Sw8bMwlhzfJW3bl02YwAiAml2GQdOxNdCoaAh9zLSpkPEISKqSvjQdPmkWSbFjYQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148981},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"1e85648776da07c9e962906787a63f326e97b010","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.3","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.26_1752276494486_0.06874079625134022","host":"s3://npm-registry-packages-npm-production"}},"1.0.27":{"name":"mcp-voice-hooks","version":"1.0.27","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.27","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"fc858ee2671fa90a6c2c17faf14aa680dbc1b9a7","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.27.tgz","fileCount":17,"integrity":"sha512-QZu+NoV1k8Vv3j4RSkswOSImrB3i75YHe7HSRIrde2c1QkOZO6nEpiEqxj3ibgk7HigVyHA+8sI1t2fUepvviA==","signatures":[{"sig":"MEYCIQDPSaW/oYyZ/H8/vnJWcy4cnEtaZc+PJ+xqiq7+acMMqAIhAOyd19KTBkNjBOJDydsUaFwnU2syPuVfKVsgXV9nq8B9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151709},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"5054a9835426ca224ad04d7fe73e05ab77e27b0e","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.3","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.27_1752668774548_0.8912516301826272","host":"s3://npm-registry-packages-npm-production"}},"1.0.28-beta.1":{"name":"mcp-voice-hooks","version":"1.0.28-beta.1","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.28-beta.1","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"53b27c29ce99a82d8c48e1ef5b4c825bb60c25ee","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.28-beta.1.tgz","fileCount":17,"integrity":"sha512-JCoSjTlqcPk34W01xZPzfJRBegS3syS2PIRt2u1lHRQ48nRC1q/myU39dbp0mK0nCsWth+f0cRzBUPTe9+q5wQ==","signatures":[{"sig":"MEQCIF7I/8X55j+US3beIw/6dheEf81Ytd+e8c1wQjcZ4FB0AiAKDqwtDuHymE7arsjXXr3v3OqPLqM8eJdkQ+FDkgIW6g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":154441},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"f369c145ec654ddc114ba75e1f3f8081b62d67be","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.3","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.28-beta.1_1753146062921_0.2515863603458257","host":"s3://npm-registry-packages-npm-production"}},"1.0.28":{"name":"mcp-voice-hooks","version":"1.0.28","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.28","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"66be54c477ce3cd1535596faf186e4541db265bb","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.28.tgz","fileCount":17,"integrity":"sha512-6aAoCL6VQlF8QwqT4bg/iT69RihNOKFAIkNvbdTsieIPk1otsg/NYdIH9vN14tHqW6jruU2zcR92SVvqIKKlHQ==","signatures":[{"sig":"MEUCIElVlKYYTavASq9rOeHQ9xuxNjnTX/gyWFbNNi94P2YjAiEA3h35IGS9NeyM3f2+aq3nIoFd2xk3tRzmYB/XVVcYJcU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151722},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"04c9e1fad39233ed2bfeae1e8884359cbfeced98","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.4","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.28_1756479720437_0.4675488305366948","host":"s3://npm-registry-packages-npm-production"}},"1.0.29":{"name":"mcp-voice-hooks","version":"1.0.29","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.29","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"af28d1c03c8581d1a038028a1624f13547580834","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.29.tgz","fileCount":17,"integrity":"sha512-J481Mg6nQ+jGHlewe0qRGVDqfNfB+LTwyMtkn3Jkvc/6yelwWCIAv8hc6+d/Sp2tCzz2ti+P/URjcKOQrIZvMQ==","signatures":[{"sig":"MEUCIAd3Xc7rS4Xc4OeEbA2aLt+0ySrq5sXvtkn2Rs5icE6IAiEA3ySiQujiEaKe9sCzhmW9JxESBg1Ka13o/OkqKlJttZI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152822},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"617a415beaeabf77b3cbc29811d498f12cfdc561","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.29_1757429814361_0.773720198321157","host":"s3://npm-registry-packages-npm-production"}},"1.0.30":{"name":"mcp-voice-hooks","version":"1.0.30","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.30","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"3769bb0d98c017d03c9ff7e22eb01cf463c1d2bb","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.30.tgz","fileCount":17,"integrity":"sha512-X1NcnfGIjxIO/m5NTly9cEWABHSaDvqrh0IGLEIANSNfmCCQ9YrqD95Iz+buj72IJ8OyMd0OuO1Dc8zEXOkhdw==","signatures":[{"sig":"MEUCIDrPNSZUwVpS+jEldjvnGVRAXWhjt7Q/iepY2Ds1ovcSAiEA7kiQ51QCzicbLuN/u5oOxgCnAgIZcLlG0eMVt5WnlYc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":149575},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"cc6f79fe987803280ec5993bcce65aadd8b7c5da","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.30_1757715685619_0.48343771476021447","host":"s3://npm-registry-packages-npm-production"}},"1.0.31":{"name":"mcp-voice-hooks","version":"1.0.31","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.31","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"63e7349b9abff80d2674c5dfe46bd9d8154c28d6","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.31.tgz","fileCount":23,"integrity":"sha512-2D349m63yf2fwjAJQIu0fDBYzRA8q2ikMJ5lyv4gsghw7O5px9EU2bE4ipngK2sIAQjUsMehXvGGXx2jspU9hA==","signatures":[{"sig":"MEUCIFsPS7+chAtaAfy9WMMnCJAjM656QLKuBF6y4JoJOMG5AiEArJdMKsSZRmxdNL+CalDKzcuzlzaB1f4UsyK2uJQNYUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153045},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"6ef5a2d84da16d1bbd45a95b28528b14e4a2e4a6","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.31_1760212843675_0.2892945534410738","host":"s3://npm-registry-packages-npm-production"}},"1.0.32":{"name":"mcp-voice-hooks","version":"1.0.32","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.32","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"20b9e17ee11d63a0a12295b3868d8c6323cd9d4c","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.32.tgz","fileCount":23,"integrity":"sha512-Gh4DjFC10L+ezZ0WR4BssqAHMMV6R/1OEG+sH5eWrPVDAJNW4vmHlK5daoqz4yPXX5dyY+iLukWgo9QWSHgMaw==","signatures":[{"sig":"MEUCICvQUDJYsjqoy2GP0h0izAzFd760dhsFENGEHYsUMw5zAiEAnpvWBe9Wi+PBmeS4mYJ0REOgUHbM4zB+6dn5AOaqm9A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":153137},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"294c19fe6afc2b6c584f8e5bfa8dad03a80112b1","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.32_1760216831449_0.8798613543032581","host":"s3://npm-registry-packages-npm-production"}},"1.0.33":{"name":"mcp-voice-hooks","version":"1.0.33","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.33","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"8c004f7e061389e5829871200b5743a8a1da3dc3","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.33.tgz","fileCount":23,"integrity":"sha512-RKT2U69QRH0x95PBgkZQg6V2qENncFo4Osa3VQlnRx/DPJ2WYzETCYswe2jVQEa8njlGt5N+5PMmoCI1nTDZ7w==","signatures":[{"sig":"MEQCIAOd2+shyDs+PjDRBhi8inBiegnD1+kHrm7dwmem3tY2AiBs505pyWhWEIb+I+Bc1kGK0jWBd67G8+zW4DGfLuzixw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":152037},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"ffadf4facc18851bf0be6d50ca3dcd7830867c7d","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.33_1760229284410_0.033844820797787056","host":"s3://npm-registry-packages-npm-production"}},"1.0.35":{"name":"mcp-voice-hooks","version":"1.0.35","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.35","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"68dacca5799cc926a1d738caad814800d1250233","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.35.tgz","fileCount":24,"integrity":"sha512-nY1GdQt78oT/8Jqo/xz5zX79/RjqpN5YjxohI0w8C7iyh2/FXfcxADRXnrw8ahwciIpp+iOeCNzAEoYzAyRsbA==","signatures":[{"sig":"MEYCIQCIYssW7cA6F8i7I8q3GQ6klpVRuUMbT2cLwkmY603euwIhAOk5JbsoUtTnxAXfJYAAc/1jOTMDVqCfKce0I8+gi2mf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162641},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"ae329ff946f59d75f935429a9da0c805d9b7d239","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","release":"npm version patch && git push --follow-tags","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.35_1762970707046_0.5471404600477388","host":"s3://npm-registry-packages-npm-production"}},"1.0.34":{"name":"mcp-voice-hooks","version":"1.0.34","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.34","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"bdd5e58446851b9a60627d5b88648119cd4ae47e","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.34.tgz","fileCount":23,"integrity":"sha512-3KE3gADnBn9MxnCn3Xl5hFQxu/Ljy9pnW7PtBnbYeM373tZDk9Y1mYXzswusHnH0X7U7n92q18a7UTuaUopuvw==","signatures":[{"sig":"MEQCIB1meVHyZqnBOXssP4tklC3Eg/hUYGNHnMR4jCVRPIpVAiAoXpV7sgy9HFZro28Qc8WRSOMPSRULqFW8Ox71zm7R+A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":161785},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"29b21494f87a44a3124bef0fe0a1f20d1e4b5631","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.34_1762970708792_0.20655584201398391","host":"s3://npm-registry-packages-npm-production"}},"1.0.36":{"name":"mcp-voice-hooks","version":"1.0.36","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.36","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"900c30ae5c9d7e6e4f934a4dd902a82934b9930a","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.36.tgz","fileCount":24,"integrity":"sha512-VktJ5CPAJS5zlHK3iBFbZgaX6EvMgFwZJU0GKbWZKKf5l9AyLXSLwznhAXd0mBMiGYc0vYv1N3OROk7noc9zfA==","signatures":[{"sig":"MEQCIGhcwMD6jQYHOYMaMyuZQT9ero3O1aRE+v+Pg1BFP9HsAiAYfW70I7wmmACqAR/LW8GLpxrinhmYWnyk4x/+gREn8w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":162641},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"27f0cc1c9d6bd708e80a9b2bda9ef68c57cbe6fd","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","release":"npm version patch && git push --follow-tags","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.36_1762971764946_0.5168685441470939","host":"s3://npm-registry-packages-npm-production"}},"1.0.37":{"name":"mcp-voice-hooks","version":"1.0.37","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.37","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"b88844600b69588c8ff0fa85805c8a3bd03e2a8a","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.37.tgz","fileCount":24,"integrity":"sha512-Wqnlr2QbOWJq0LdGNIUyKzQN/1/p07NvbjOMxtSku2G+XipVHdKDLbFSD6amCzfFzTt8x2nTev/QIMPFLEO+Rw==","signatures":[{"sig":"MEQCIH0zxMrIBNi6KenGx0bD1dSfGgm0Omv7aILG1REBe9btAiAz59XQ1m3cbQVBu+viFk4lzgiLPPT/6akizCelXnxRHw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":148968},"main":"dist/index.js","type":"module","types":"./dist/index.d.ts","gitHead":"6c22f6c99038228ba9b454e53930898f525cfb34","scripts":{"dev":"nodemon --exec ts-node --esm src/index.ts","test":"jest","build":"tsup","start":"node dist/index.js","prepare":"husky","release":"npm version patch && git push --follow-tags","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json","dev-debug":"DEBUG=true nodemon --exec ts-node --esm src/index.ts","test:watch":"jest --watch","dev-unified":"ts-node --esm src/unified-server.ts","mcp-unified":"ts-node --esm src/unified-server.ts --mcp-managed","dev-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts","mcp-unified-debug":"DEBUG=true ts-node --esm src/unified-server.ts --mcp-managed"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","nodemon":"^3.1.10","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.37_1762978772824_0.19266223503640156","host":"s3://npm-registry-packages-npm-production"}},"1.0.38":{"name":"mcp-voice-hooks","version":"1.0.38","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.38","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"aab26527fd49fdd0361a04beee52ec5952fc08ab","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.38.tgz","fileCount":22,"integrity":"sha512-dqZg2TxhTWCwPEfwB7STa7rA5gQHYE+Ktf6PZc8kbfmY44BzmGSvSxsStv14xfdxfW4/q0utRuVZaf7ZWUra7Q==","signatures":[{"sig":"MEQCIGsUwqPFY5Ou7yCRs+7qJ/Ql2OUI0VKxBz3W1YgfkFuAAiBUp8RxEVRHIipz39DmqB8JQhC3fsxzizmdKkIIGc2JSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":196145},"main":"dist/unified-server.js","type":"module","types":"./dist/unified-server.d.ts","gitHead":"c596309301f8f0ce2330543f654dca000118e83e","scripts":{"dev":"ts-node --esm src/unified-server.ts","mcp":"ts-node --esm src/unified-server.ts --mcp-managed","test":"jest","build":"tsup","start":"node dist/unified-server.js","prepare":"husky","release":"npm version patch && git push --follow-tags","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json","dev-debug":"ts-node --esm src/unified-server.ts --debug","mcp-debug":"ts-node --esm src/unified-server.ts --mcp-managed --debug","test:watch":"jest --watch"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.38_1763055183956_0.25526717481735295","host":"s3://npm-registry-packages-npm-production"}},"1.0.39":{"name":"mcp-voice-hooks","version":"1.0.39","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.39","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"8989c79834bad43ce54be3442f084ca56f4a9703","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.39.tgz","fileCount":22,"integrity":"sha512-KotUGCrehKElzsEMSLG8gDm54LkKH/z4F5P6uWC/On2x53NJAG7CR8vM7okVMKJn+StilYhshH/LoZUc0OTkig==","signatures":[{"sig":"MEQCIHBNJnAwN6x3YRbxdFGS5TPPY7N7MuB5MNeKmR0PhH5wAiB9Y0b7SNIEuakz1BTMylMZ881b+Ku4IIHEWxo6Y02fpA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201470},"main":"dist/unified-server.js","type":"module","types":"./dist/unified-server.d.ts","gitHead":"e5a5d04c07578ee9c75dd765daf8a44b93cc121d","scripts":{"dev":"ts-node --esm src/unified-server.ts","mcp":"ts-node --esm src/unified-server.ts --mcp-managed","test":"jest","build":"tsup","start":"node dist/unified-server.js","prepare":"husky","release":"npm version patch && git push --follow-tags","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json","dev-debug":"ts-node --esm src/unified-server.ts --debug","mcp-debug":"ts-node --esm src/unified-server.ts --mcp-managed --debug","test:watch":"jest --watch"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.39_1763057544652_0.9959786270393969","host":"s3://npm-registry-packages-npm-production"}},"1.0.40":{"name":"mcp-voice-hooks","version":"1.0.40","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","_id":"mcp-voice-hooks@1.0.40","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"bin":{"mcp-voice-hooks":"bin/cli.js"},"dist":{"shasum":"1e9be2540e058b9a6f927803f296876cd338db65","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.40.tgz","fileCount":22,"integrity":"sha512-0K7LHnSCOUPUv07XLetUzgN6tJO/aKfrZPr+7rWhvgvUkg0jFhEqmbyQQO8n8cxClAsXJXGus20HIiWp3TbCrQ==","signatures":[{"sig":"MEYCIQCzilTbtSAp3otzFqiAQi4KLWljGZtzBOUD9lSnbm3syQIhAJcmFBkaKEwTTrxrziFfNfZez0HhOyYZaCrkE1Tz8LkN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":201502},"main":"dist/unified-server.js","type":"module","types":"./dist/unified-server.d.ts","gitHead":"6f8031e85fca87c94f0478326aee6b99fb2d8ff6","scripts":{"dev":"ts-node --esm src/unified-server.ts","mcp":"ts-node --esm src/unified-server.ts --mcp-managed","test":"jest","build":"tsup","start":"node dist/unified-server.js","prepare":"husky","release":"npm version patch && git push --follow-tags","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json","dev-debug":"ts-node --esm src/unified-server.ts --debug","mcp-debug":"ts-node --esm src/unified-server.ts --mcp-managed --debug","test:watch":"jest --watch"},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"repository":{"url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git","type":"git"},"_npmVersion":"10.8.2","description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","directories":{"doc":"docs"},"_nodeVersion":"20.19.5","dependencies":{"cors":"^2.8.5","open":"^10.1.2","express":"^5.1.0","@modelcontextprotocol/sdk":"^1.13.3"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","knip":"^5.61.3","tsup":"^8.5.0","husky":"^9.1.7","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","supertest":"^7.1.1","typescript":"^5.8.3","@types/cors":"^2.8.19","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/express":"^5.0.3","@types/supertest":"^6.0.3"},"_npmOperationalInternal":{"tmp":"tmp/mcp-voice-hooks_1.0.40_1763077986647_0.29235709425055467","host":"s3://npm-registry-packages-npm-production"}},"1.0.42":{"name":"mcp-voice-hooks","version":"1.0.42","main":"dist/unified-server.js","type":"module","bin":{"mcp-voice-hooks":"bin/cli.js"},"directories":{"doc":"docs"},"scripts":{"build":"tsup","dev":"ts-node --esm src/unified-server.ts","dev-debug":"ts-node --esm src/unified-server.ts --debug","mcp":"ts-node --esm src/unified-server.ts --mcp-managed","mcp-debug":"ts-node --esm src/unified-server.ts --mcp-managed --debug","start":"node dist/unified-server.js","test":"jest","test:watch":"jest --watch","prepare":"husky","version":"node scripts/sync-plugin-version.cjs && git add plugin/.claude-plugin/plugin.json dev-marketplace/dev-plugin/.claude-plugin/plugin.json plugin/.mcp.json","release":"npm version patch && git push --follow-tags"},"description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"author":"","license":"UNLICENSED","repository":{"type":"git","url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git"},"bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","dependencies":{"@modelcontextprotocol/sdk":"^1.13.3","cors":"^2.8.5","express":"^5.1.0","open":"^10.1.2","ws":"^8.19.0"},"devDependencies":{"@types/cors":"^2.8.19","@types/express":"^5.0.3","@types/jest":"^30.0.0","@types/node":"^24.0.10","@types/supertest":"^6.0.3","@types/ws":"^8.18.1","husky":"^9.1.7","jest":"^29.7.0","knip":"^5.61.3","supertest":"^7.1.1","ts-jest":"^29.4.0","ts-node":"^10.9.2","ts-prune":"^0.10.3","tsup":"^8.5.0","typescript":"^5.8.3"},"_id":"mcp-voice-hooks@1.0.42","gitHead":"5c4771cb87966983ee0140df8cfd3d29c02f5ecd","types":"./dist/unified-server.d.ts","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-+jK7mNPau7VWP3LJScr44OR8RmDN677pz/2FMJXMOESeqBx7cbh25uJ7mczi6fJ9SSHhSpfcrcmc77VjNTfk6w==","shasum":"8477bd0660df5df63642db3b9901726e0363b6f2","tarball":"https://registry.npmjs.org/mcp-voice-hooks/-/mcp-voice-hooks-1.0.42.tgz","fileCount":36,"unpackedSize":542154,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGCRMY71iK4m7U5JV1N19WiCF7toC34gB3zaTU6PJbe/AiEArMSjv88pV9qle0pMN6xy0yAZSreRCvdKTKWVxOHiED4="}]},"_npmUser":{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"},"maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-voice-hooks_1.0.42_1785516271249_0.14544955414419025"},"_hasShrinkwrap":false}},"time":{"created":"2025-07-04T18:28:54.756Z","modified":"2026-07-31T16:44:31.616Z","1.0.0":"2025-07-04T18:28:55.025Z","1.0.1":"2025-07-04T18:57:25.425Z","1.0.2":"2025-07-05T01:26:54.578Z","1.0.6":"2025-07-05T14:42:48.605Z","1.0.8":"2025-07-06T02:49:48.863Z","1.0.12":"2025-07-08T11:15:09.406Z","1.0.13":"2025-07-08T22:24:30.977Z","1.0.14":"2025-07-09T14:47:23.141Z","1.0.15":"2025-07-09T15:51:59.558Z","1.0.16":"2025-07-09T18:53:49.270Z","1.0.18":"2025-07-10T10:47:23.960Z","1.0.20":"2025-07-10T11:22:47.239Z","1.0.21":"2025-07-10T14:19:49.805Z","1.0.22":"2025-07-11T18:14:50.712Z","1.0.25":"2025-07-11T19:26:30.341Z","1.0.26":"2025-07-11T23:28:14.661Z","1.0.27":"2025-07-16T12:26:14.750Z","1.0.28-beta.1":"2025-07-22T01:01:03.133Z","1.0.28":"2025-08-29T15:02:00.656Z","1.0.29":"2025-09-09T14:56:54.549Z","1.0.30":"2025-09-12T22:21:25.816Z","1.0.31":"2025-10-11T20:00:43.869Z","1.0.32":"2025-10-11T21:07:11.630Z","1.0.33":"2025-10-12T00:34:44.606Z","1.0.35":"2025-11-12T18:05:07.242Z","1.0.34":"2025-11-12T18:05:08.953Z","1.0.36":"2025-11-12T18:22:45.149Z","1.0.37":"2025-11-12T20:19:33.061Z","1.0.38":"2025-11-13T17:33:04.148Z","1.0.39":"2025-11-13T18:12:24.840Z","1.0.40":"2025-11-13T23:53:06.882Z","1.0.42":"2026-07-31T16:44:31.456Z"},"bugs":{"url":"https://github.com/johnmatthewtennant/mcp-voice-hooks/issues"},"license":"UNLICENSED","homepage":"https://github.com/johnmatthewtennant/mcp-voice-hooks#readme","keywords":["mcp","claude","claude-code","voice","speech-recognition","model-context-protocol","ai-assistant","voice-control"],"repository":{"type":"git","url":"git+https://github.com/johnmatthewtennant/mcp-voice-hooks.git"},"description":"Real-time voice interaction for Claude Code. Speak naturally while Claude works - interrupt, redirect, or provide continuous feedback without stopping.","maintainers":[{"name":"johnmatthewtennant","email":"johnmatthewtennant@gmail.com"}],"readme":"# Voice Mode for Claude Code\n\nVoice Mode for Claude Code allows you to have a continuous two-way conversation with Claude Code, hands-free.\n\nIt uses the new [Claude Code hooks](https://docs.anthropic.com/en/docs/claude-code/hooks) to deliver voice input to Claude while it works.\n\nThis lets you speak continuously to Claude - interrupt, redirect, or provide feedback without stopping what Claude is doing.\n\nOptionally enable text-to-speech to have Claude speak back to you.\n\nVoice recognition and text-to-speech are handled by the browser, so there is nothing to download, and no API keys are needed.\n\n## Demo Video\n\n[![Demo Video](https://img.youtube.com/vi/GbDatJtm8_k/0.jpg)](https://youtu.be/GbDatJtm8_k)\n\n## Requirements\n\n- Claude Code 2.1.69 or later (run `claude --version` to check)\n- macOS (for system text-to-speech)\n- Chrome or Safari (for speech recognition)\n\n## Installation\n\nInstallation is easy.\n\n### 1. Install Claude Code\n\n```bash\nnpm install -g @anthropic-ai/claude-code\n```\n\n### 2. Install Voice Mode\n\nAdd the following to any Claude Code settings file (`~/.claude/settings.json`, `.claude/settings.json`, or `.claude/settings.local.json`):\n\n```json\n{\n  \"extraKnownMarketplaces\": {\n    \"mcp-voice-hooks-marketplace\": {\n      \"source\": {\n        \"source\": \"git\",\n        \"url\": \"https://github.com/johnmatthewtennant/mcp-voice-hooks.git\"\n      }\n    }\n  },\n  \"enabledPlugins\": {\n    \"mcp-voice-hooks-plugin@mcp-voice-hooks-marketplace\": true\n  }\n}\n```\n\nRestart Claude Code. Set `\"mcp-voice-hooks-plugin@mcp-voice-hooks-marketplace\"` to `false` to temporarily disable.\n\n## Usage\n\n### 1. Start Claude Code\n\n```bash\nclaude\n```\n\n### 2. Start Listening\n\nThe browser interface will automatically open after 3 seconds (<http://localhost:5111>).\n\nClick \"Start Listening\"\n\n### 3. Speak\n\nSay something to Claude. You will need to send one message in the Claude Code CLI to start the conversation.\n\n### 4. Trigger Word Mode (Optional)\n\nBy default, utterances are sent automatically when you pause. You can switch to \"Wait for Trigger Word\" mode in the browser interface:\n\n1. Toggle to \"Wait for Trigger Word\" mode\n2. Enter a trigger word (e.g., \"send\", \"claude\", \"go\")\n3. Speak your message(s) - they will queue up in the browser\n4. Say your trigger word to send all queued messages at once (or click \"Send Now\")\n\nThe trigger word is case-insensitive and will be automatically removed from your message before sending.\n\n## Browser Compatibility\n\n- ✅ **Chrome**: Full support for speech recognition, browser text-to-speech, and system text-to-speech\n- ⚠️ **Safari**: Full support for speech recognition and system text-to-speech, but browser text-to-speech cannot load high-quality voices\n- ❌ **Edge**: Speech recognition not working on Apple Silicon (language-not-supported error)\n\n## Voice responses\n\nThere are two options for voice responses:\n\n1. Browser Text-to-Speech\n2. System Text-to-Speech\n\n### Selecting and downloading high quality System Voices (Mac only)\n\nMac has built-in text to speech, but high quality voices are not available by default.\n\nYou can download high quality voices from the system voice menu: `System Settings > Accessibility > Spoken Content > System Voice`\n\nClick the info icon next to the system voice dropdown. Search for \"Siri\" to find the highest quality voices. You'll have to trigger a download of the voice.\n\nOnce it's downloaded, you can select it in the Browser Voice (Local) menu in Chrome.\n\nTest it with the bash command:\n\n```bash\nsay \"Hi, this is your Mac system voice\"\n```\n\nTo use Siri voices with voice-hooks, you need to set your system voice and select \"Mac System Voice\" in the voice-hooks browser interface.\n\nOther downloaded voices will show up in the voice dropdown in the voice-hooks browser interface so you can select them there directly, instead of using the \"Mac System Voice\" option.\n\nThere is a bug in Safari that prevents browser text-to-speech from loading high-quality voices after browser restart. This is a Safari Web Speech API limitation. To use high-quality voices in Safari you need to set your system voice to Siri and select \"Mac System Voice\" in the voice-hooks browser interface.\n\n## Known Limitations\n\n- **Background agents don't notify in voice mode.** When Claude launches background agents (via the Agent tool), their completion notifications appear in the conversation text but don't trigger hooks. This means you won't hear a voice notification when a background task finishes. **Workaround:** Manually check background agent status, or avoid using background agents during voice sessions. *(Verified with Claude Code 2.1.69, March 2026)*\n\n## Uninstallation\n\nRemove the `extraKnownMarketplaces` and `enabledPlugins` entries from your settings file and restart Claude Code.\n\n### Alternative: Manual Installation\n\nIf you prefer not to use the plugin system, you can install manually:\n\n```bash\nnpx mcp-voice-hooks@latest install-hooks\nclaude mcp add voice-hooks npx mcp-voice-hooks@latest\n```\n\nTo uninstall:\n\n```bash\nclaude mcp remove voice-hooks\nnpx mcp-voice-hooks uninstall\n```\n\n## Configuration\n\n#### Port Configuration\n\nThe default port is 5111. To use a different port, set the `MCP_VOICE_HOOKS_PORT` environment variable in your project's `.claude/settings.local.json`:\n\n```json\n{\n  \"env\": {\n    \"MCP_VOICE_HOOKS_PORT\": \"8080\"\n  }\n}\n```\n\nThis environment variable is used by both:\n\n- The MCP server to determine which port to listen on\n- The Claude Code hooks to connect to the correct port\n\n**Note**: Setting this in `.claude/settings.local.json` is the recommended approach. The environment variable will be available to both the MCP server process and the hook commands.\n\n#### Network exposure\n\nThe server listens on `127.0.0.1` only. This matters more than a normal localhost service: `POST /api/potential-utterances` delivers text to Claude as if you had spoken it, in a session that can edit files and run commands, and `GET /api/conversation` returns the transcript. There is no authentication, so reachability is the whole boundary.\n\nCross-origin browser requests are also refused outright — not just hidden by CORS — so a page on another site cannot post utterances into your session from a tab you happen to have open.\n\n#### HTTPS (for access from other devices)\n\nBrowsers block microphone access on insecure origins. HTTPS is enabled automatically — the server generates a self-signed certificate on first startup and serves HTTPS on port 5112 (HTTP port + 1).\n\nBecause the server binds loopback by default, using another device is opt-in:\n\n```json\n{\n  \"env\": {\n    \"MCP_VOICE_HOOKS_BIND\": \"0.0.0.0\"\n  }\n}\n```\n\nThen open `https://<your-hostname>.local:5112` on the other device and accept the self-signed certificate warning. Your hostname's HTTPS origin is allowed automatically; add any others with `MCP_VOICE_HOOKS_EXTRA_ORIGINS` (comma-separated).\n\n**Only do this on a network you trust.** While it is set, anything that can reach the port — every other device on that Wi-Fi, and any VPN or tailnet interface the machine is on — can drive your Claude session and read the conversation. The server prints a warning at startup when it is not bound to loopback.\n\nTo customize the HTTPS port:\n\n```json\n{\n  \"env\": {\n    \"MCP_VOICE_HOOKS_HTTPS_PORT\": \"8443\"\n  }\n}\n```\n\nTo regenerate the certificate (e.g., after a hostname change), delete the `certs/` directory and restart, or run `./scripts/generate-certs.sh`.\n\n#### Browser Auto-Open\n\nWhen running in MCP-managed mode, the browser will automatically open if no frontend connects within 3 seconds. To disable this behavior:\n\n```json\n{\n  \"env\": {\n    \"MCP_VOICE_HOOKS_AUTO_OPEN_BROWSER\": \"false\"\n  }\n}\n```\n","readmeFilename":"README.md"}