{"_id":"@deshartman/mcp-status-callback","_rev":"11-5e2e4c47bc0f70fc1bb38974a4d8116d","name":"@deshartman/mcp-status-callback","dist-tags":{"latest":"0.5.1"},"versions":{"0.1.0":{"name":"@deshartman/mcp-status-callback","version":"0.1.0","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.1.0","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"01a778b3a3d72bbf99ac930390e286840dfcbacb","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.1.0.tgz","fileCount":12,"integrity":"sha512-uDY3Dd3BDzJvE2tCAnEK170fqpwatU54NeQgl2H8JynRxrEOPrwFCDd8bu9DJ/aJliU1k+Nv4o3v5x54pk2ldg==","signatures":[{"sig":"MEUCIQCwJvlfxRL3Z0aypDyUnjNX3zS5dSdfS5whZsu+XY8FygIgDb/xNSv4VAFmQyhUGoSC6GoDRYrlycKzzGSUFv6WFMs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30758},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"a820ff4eb0e9b771c2b31a296ada330fff8a4396","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^20.10.5","@types/express":"^5.0.1"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.1.0_1743064058578_0.8684656105461599","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@deshartman/mcp-status-callback","version":"0.2.0","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.2.0","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"832ff1e7d6b63408ad3a880063c13223424d1fae","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.2.0.tgz","fileCount":12,"integrity":"sha512-2uqxvEB/xYFIZLeZiUCPMJEgPM43oEaRSk+LVeV0wD8H+uJvILVLbrhzMJMPYP+etGEs4tGISCDvwV8obOMkNg==","signatures":[{"sig":"MEYCIQDHmqJvz96YvguzZJyBBb6k0XmDpZNrfmmUyfPWpV6s9QIhAOe9LdzMqcshtBpaOju8EJaEaj7ZeaTErdTFk0ifOvwN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":31905},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"a820ff4eb0e9b771c2b31a296ada330fff8a4396","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^20.10.5","@types/express":"^5.0.1"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.2.0_1743064848811_0.7289768733160404","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@deshartman/mcp-status-callback","version":"0.3.0","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.3.0","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"1f55f2408d4a0b1fe0fdd404b881afde926d3d04","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.3.0.tgz","fileCount":12,"integrity":"sha512-gR4PDWa3VO7j8fiiJfASDZAybhutOm3CGUHqYW2gY/a4H1pRSAD1ZsieSE6C1lVxV6lEB7jLwT8ymAYLYjek2w==","signatures":[{"sig":"MEQCICYMR1QbWBD4NkHNADnEpVvkv9AYCHDuat4x1l2flbT6AiA/yBxn+cY8Pwp6iPUCJbJHwlbuIYCexp7BH+mXGTt4BA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35488},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"b00b7628c797f32cf570ff669f0123a31e67ea43","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^20.10.5","@types/express":"^5.0.1"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.3.0_1743108247331_0.6812926853606724","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@deshartman/mcp-status-callback","version":"0.3.1","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.3.1","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"d9c3d4206d5288f5a3ec315647cb17cb33f0f594","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.3.1.tgz","fileCount":12,"integrity":"sha512-6P5oW5bgVED4fnpvmA5TRfoE07eQaly6NTBwtO6Qf0r2b1XkbuZAKferx8HS7qwJHbhEWG2j7wsOIeON2p6HJg==","signatures":[{"sig":"MEQCIADREty3sZiSQdu5csC0zMjWj5e1s8ZfZeXN6j4khA2cAiByv8GNtZChuPUquJwELEq0nI5gbhYVgxVtl4E9cIl46w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":35650},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"95889aef7fb594c02bdf173e1c22bfea1cd61498","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^20.10.5","@types/express":"^5.0.1"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.3.1_1743125715473_0.37679973704318037","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@deshartman/mcp-status-callback","version":"0.4.0","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.4.0","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"50af8994426479ee177ad3745b44be74eaa3ae9e","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.4.0.tgz","fileCount":9,"integrity":"sha512-Zazbdf0Bwad6fz3iJDx8QjLghZ7AxN3qNp8wR1qZjCI2neib2TRc135I+3YjKglsgI3x0Y3RgY6XhLFA8/Y8qA==","signatures":[{"sig":"MEUCIQCOMVzLo+mwgCfWF0wJ3hP4g3hHhX/zVm/MfyCCG6UWfAIgfliI/hi1f+KAcQ/nDB24mtE+bjP4L/ApVqNbFA/N06c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25295},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"53c49ead55ee2d37bf67b41f3b94dc183e7332cf","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^20.10.5","@types/express":"^5.0.1"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.4.0_1743204098877_0.8319299837304905","host":"s3://npm-registry-packages-npm-production"}},"0.4.1":{"name":"@deshartman/mcp-status-callback","version":"0.4.1","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.4.1","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"323155fa8fd151a3aeaec05f806aabdf348eee27","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.4.1.tgz","fileCount":9,"integrity":"sha512-hfH5ztXeBT0FZSMjTUxOnY37O7yx3xAnMFkUxypCqnXm9u3Ei8kVlO8ghr08AEJsTp1EXS/KEnrj4KKE6PTZIg==","signatures":[{"sig":"MEYCIQD1uO0ne8rHPk2BRH0ew5kWBaLifh7p5uu2aAseoOIdswIhAL4LQDSyXpfWJFy8r7mLJjqZ8Ook/CLn9s8LCaHY6rEW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":25330},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"02c8876161252a84b5895537bfaa41b21939242f","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^20.10.5","@types/express":"^5.0.1"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.4.1_1743559896339_0.5382798551509209","host":"s3://npm-registry-packages-npm-production"}},"0.4.2":{"name":"@deshartman/mcp-status-callback","version":"0.4.2","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.4.2","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"0d6a7a9c6790d6258b5a54d25586e714950e4e6b","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.4.2.tgz","fileCount":9,"integrity":"sha512-/6eFG46oVqngqiaQwMq4mWYZ4XC/hb2hSAyetUGogfuj6EUmeel1DL058m8nftfi6ajaYFnaIygAm0kJswHzeA==","signatures":[{"sig":"MEQCIAme7BbT/nXYnLB3x8CVMNElLtscRGG/dHD9w88yx6CAAiBrIONPRGQjArumx+Y9CiCJDOTJWXFpFVPlDDH7AOAKBg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27447},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=14.0.0"},"gitHead":"02c8876161252a84b5895537bfaa41b21939242f","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^5.0.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^20.10.5","@types/express":"^5.0.1"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.4.2_1743564907313_0.6807698027195721","host":"s3://npm-registry-packages-npm-production"}},"0.4.3":{"name":"@deshartman/mcp-status-callback","version":"0.4.3","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.4.3","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"d47465fb271af88a18826cd89924c4ec585dcb42","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.4.3.tgz","fileCount":9,"integrity":"sha512-BZqQp6u+yktydOpgDCznZgv0Rhplvh7ymvEPn5u/9PySrR6V5iganXnzezKqBzgiAmr/StegFb5NkzQwF+0Tvw==","signatures":[{"sig":"MEUCIQD9U2wXkgfQeNZ/E3TxiT/LTdJb96EPFQepCPEOAVE5HAIgTTzpWB54foesER9SaVtmPOygYoImwqXot46a10HCctg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27451},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"6afe71ae42ec6ba29150be56ca46c3229ddfeadc","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^4.18.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^16.18.86","@types/express":"^4.17.21"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.4.3_1743634403531_0.2627404572944876","host":"s3://npm-registry-packages-npm-production"}},"0.4.4":{"name":"@deshartman/mcp-status-callback","version":"0.4.4","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.4.4","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"cc6c320b9e46a6674a3b71fa7b295220bca422b1","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.4.4.tgz","fileCount":9,"integrity":"sha512-CcqRpKNh6gPXiPgkLHkgp+sa0K5QvKo2YBnBdIPaP6GwZDte1eUxycudd2U/YWBron3xxYPwjzujJlHrCbm3Zw==","signatures":[{"sig":"MEUCIQDE5odNwBS0pY4VwVFq/KNloE7O+2/5L4e9KgfLU8JpAgIgB8ilev56uzaBC+2NGroPumQWpbTjel8L/G82JjhJ+uw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":27451},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"31270affe9fbc960a3fe77c5fc4b16d549a5b64f","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.5.0","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"18.20.2","dependencies":{"ngrok":"^5.0.0-beta.2","express":"^4.18.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^18.19.26","@types/express":"^4.17.21"},"peerDependencies":{"ngrok":">=4.0.0","express":">=4.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.4.4_1743636187086_0.3050132636428018","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@deshartman/mcp-status-callback","version":"0.5.0","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","_id":"@deshartman/mcp-status-callback@0.5.0","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"homepage":"https://github.com/deshartman/mcp-status-callback#readme","bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"dist":{"shasum":"25a8c4bdc7cdf6ff5b9d530e6dfb66ac52100c92","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.5.0.tgz","fileCount":9,"integrity":"sha512-M2M126L5buyUv/2gt+exDZX8x7Y4z+67g8JjIuArdTeDyYTBKnRJnE+eOXLwD13U7ffoiS9WN4++YuAB6Lg8jw==","signatures":[{"sig":"MEUCIQDMXYUDQpe9bbfZj7LD/3953E4sZ2ubuskirZ9lYCiFjwIgeWUzEW5fF9nbsd8dpwxsqyat4S8Gtf+D0sUR8UxKMPA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29250},"main":"build/index.js","type":"module","types":"build/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"398c936c8f96c206ddf2c2341fd0c30247460852","scripts":{"dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","build":"tsc && chmod +x build/index.js","start":"node build/index.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"repository":{"url":"git+https://github.com/deshartman/mcp-status-callback.git","type":"git"},"_npmVersion":"10.9.2","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","directories":{},"_nodeVersion":"22.14.0","dependencies":{"express":"^4.18.2","@ngrok/ngrok":"^1.4.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ts-node":"^10.9.2","typescript":"^5.3.3","@types/node":"^18.19.26","@types/express":"^4.17.21"},"peerDependencies":{"express":">=4.0.0","@ngrok/ngrok":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-status-callback_0.5.0_1744025945704_0.33760134536195885","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@deshartman/mcp-status-callback","version":"0.5.1","description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","main":"build/index.js","types":"build/index.d.ts","type":"module","scripts":{"build":"tsc && chmod +x build/index.js","start":"node build/index.js","dev":"ts-node src/index.ts","test":"echo \"Error: no test specified\" && exit 1","prepublishOnly":"npm run build"},"keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"author":{"name":"Des Hartman"},"license":"MIT","dependencies":{"@ngrok/ngrok":"^1.4.1","express":"^4.18.2"},"devDependencies":{"@types/express":"^4.17.21","@types/node":"^18.19.26","ts-node":"^10.9.2","typescript":"^5.3.3"},"peerDependencies":{"express":">=4.0.0","@ngrok/ngrok":">=1.0.0"},"engines":{"node":">=18.0.0"},"repository":{"type":"git","url":"git+https://github.com/deshartman/mcp-status-callback.git"},"bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"homepage":"https://github.com/deshartman/mcp-status-callback#readme","publishConfig":{"access":"public"},"_id":"@deshartman/mcp-status-callback@0.5.1","gitHead":"fa07247234c57f5e911878d1a91bd07c717e57a8","_nodeVersion":"22.14.0","_npmVersion":"10.9.2","dist":{"integrity":"sha512-I/uSNIH6X3BQ0Kk5bkFuQaeUKHd9TP8IkoDKiZs63LMbPHPaVPtZkiiugengNyOcFqYjtjdF8rAdmOVD6GqYSw==","shasum":"78bb80522ad3aa825616f0a76ac85fd131b44eef","tarball":"https://registry.npmjs.org/@deshartman/mcp-status-callback/-/mcp-status-callback-0.5.1.tgz","fileCount":9,"unpackedSize":40534,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHxwMdbuncpACLCKjiYjgARoZws83SVGa4KoifSllzF/AiEAg+CBLow+CSivLoi0hGlIZO7fkDKA6l3MHYYcb9oJH+8="}]},"_npmUser":{"name":"deshartman","email":"des@deshartman.com"},"directories":{},"maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-status-callback_0.5.1_1744160868945_0.785514874914576"},"_hasShrinkwrap":false}},"time":{"created":"2025-03-27T08:27:38.503Z","modified":"2025-04-09T01:07:49.411Z","0.1.0":"2025-03-27T08:27:38.753Z","0.2.0":"2025-03-27T08:40:48.960Z","0.3.0":"2025-03-27T20:44:07.542Z","0.3.1":"2025-03-28T01:35:15.676Z","0.4.0":"2025-03-28T23:21:39.089Z","0.4.1":"2025-04-02T02:11:36.523Z","0.4.2":"2025-04-02T03:35:07.508Z","0.4.3":"2025-04-02T22:53:23.712Z","0.4.4":"2025-04-02T23:23:07.355Z","0.5.0":"2025-04-07T11:39:05.874Z","0.5.1":"2025-04-09T01:07:49.256Z"},"bugs":{"url":"https://github.com/deshartman/mcp-status-callback/issues"},"author":{"name":"Des Hartman"},"license":"MIT","homepage":"https://github.com/deshartman/mcp-status-callback#readme","keywords":["mcp","ngrok","callback","webhook","tunnel","express","api"],"repository":{"type":"git","url":"git+https://github.com/deshartman/mcp-status-callback.git"},"description":"A utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP status callbacks.","maintainers":[{"name":"deshartman","email":"des@deshartman.com"}],"readme":"# MCP Status Callback\n\nA utility for handling API callbacks via Ngrok tunnels. Especially useful for MCP (Model Context Protocol) status callbacks.\n\nThis module creates a local Express server and establishes an Ngrok tunnel to it, allowing external services to send callbacks to your local development environment.\n\n## New in Version 0.5.0: Official ngrok SDK\n\nAs of version 0.5.0, this package now uses the official ngrok JavaScript SDK (`@ngrok/ngrok`) instead of the community-maintained package. This provides several benefits:\n\n- Official support from ngrok\n- More robust and feature-rich API\n- Better TypeScript integration\n- Improved error handling\n- Native support for TLS backends\n\nThe API remains backward compatible, so existing code should continue to work without changes.\n\n## Installation\n\n```bash\nnpm install @deshartman/mcp-status-callback\n```\n\n## Requirements\n\n- Node.js 18 or higher\n- An Ngrok account and auth token (get one at [ngrok.com](https://ngrok.com))\n\n## Usage\n\n### Basic Usage\n\n```javascript\n// Import the constants along with the class\nimport { CallbackHandler, CallbackHandlerEventNames } from '@deshartman/mcp-status-callback';\n\n// Create a new instance with required options\nconst callbackHandler = new CallbackHandler({\n  ngrokAuthToken: 'your-ngrok-auth-token',\n  customDomain: 'your-custom-domain.ngrok.dev' // Optional\n});\n\n// Set up event listeners using the constants\ncallbackHandler.on(CallbackHandlerEventNames.LOG, (data) => {\n  console.log(`${data.level}: ${data.message}`);\n});\n\ncallbackHandler.on(CallbackHandlerEventNames.CALLBACK, (data) => {\n  console.log('Received callback query parameters:', data.queryParameters);\n  console.log('Received callback body:', data.body);\n  // Process the callback data here\n});\n\ncallbackHandler.on(CallbackHandlerEventNames.TUNNEL_STATUS, (data) => {\n  if (data.level === 'error') {\n    console.error('Tunnel error:', data.message);\n  } else {\n    console.log('Callback URL:', data.message);\n    // Use this URL in your API requests\n  }\n});\n\n// Using async/await with try/catch\n(async () => {\n  try {\n    // start() now returns the public URL directly\n    const publicUrl = await callbackHandler.start();\n    console.log(`Server started! Use this URL for callbacks: ${publicUrl}`);\n    // You can now use this URL in your API requests\n  } catch (error) {\n    console.error('Failed to start callback handler:', error);\n  }\n})();\n\n// Optional: Use a custom domain (requires Ngrok paid plan)\n// async function startWithCustomDomain() {\n//   try {\n//     const callbackHandler = new CallbackHandler({\n//       ngrokAuthToken: 'your-ngrok-auth-token',\n//       customDomain: 'your-custom-domain.ngrok.dev'\n//     });\n//     const publicUrl = await callbackHandler.start();\n//     console.log(`Custom domain callback URL: ${publicUrl}`);\n//   } catch (error) {\n//     console.error('Failed to start with custom domain:', error);\n//   }\n// }\n\n// When you're done, stop the server\n// await callbackHandler.stop();\n```\n\n### TypeScript Usage\n\n```typescript\n// Import constants and types\nimport {\n  CallbackHandler,\n  CallbackEventData,\n  CallbackHandlerOptions,\n  CallbackHandlerEventNames, // Import the event name constants\n  LogEventData,              // Import other event data types if needed\n  TunnelStatusEventData\n} from '@deshartman/mcp-status-callback';\n\n// Define options with TypeScript type\nconst options: CallbackHandlerOptions = {\n  ngrokAuthToken: 'your-ngrok-auth-token',\n  customDomain: 'your-custom-domain.ngrok.dev' // Optional\n};\n\nconst callbackHandler = new CallbackHandler(options);\n\n// Use constants for event names and provide explicit types for data\ncallbackHandler.on(CallbackHandlerEventNames.LOG, (data: LogEventData) => {\n  console.log(`[${data.level.toUpperCase()}] ${data.message}`);\n});\n\ncallbackHandler.on(CallbackHandlerEventNames.CALLBACK, (data: CallbackEventData) => {\n  const queryParams = data.queryParameters; // Still 'any' based on current plan\n  const payload = data.body; // Still 'any' based on current plan\n  console.log('TS Callback received:', payload);\n  // Process the payload\n});\n\ncallbackHandler.on(CallbackHandlerEventNames.TUNNEL_STATUS, (data: TunnelStatusEventData) => {\n  if (data.level === 'info') {\n    console.log('TS Tunnel Ready:', data.message);\n  } else {\n    console.error('TS Tunnel Error:', data.message);\n  }\n});\n\n// Start the server - returns a Promise with the public URL\nconst startServer = async () => {\n  try {\n    // start() now returns the public URL directly\n    const publicUrl = await callbackHandler.start();\n    console.log(`Server started with callback URL: ${publicUrl}`);\n    return publicUrl;\n  } catch (error) {\n    console.error('Failed to start server:', error);\n    throw error; // Re-throw if you want calling code to handle it\n  }\n};\n\nstartServer();\n```\n\n## API Reference\n\n### `CallbackHandler`\n\nThe main class for handling callbacks.\n\n#### Constructor\n\n```typescript\nnew CallbackHandler(options: CallbackHandlerOptions)\n```\n\n- `options.ngrokAuthToken` (required): Your Ngrok authentication token\n- `options.customDomain` (optional): Custom domain for Ngrok tunnel (requires paid Ngrok plan)\n\n#### Methods\n\n- `start(): Promise<string>` - Starts the callback server and establishes an Ngrok tunnel. **Returns a Promise that resolves to the public callback URL**, which you can use directly in your API requests.\n- `getPublicUrl(): string | null` - Returns the public Ngrok URL if available\n- `stop(): Promise<void>` - Stops the callback server and closes the Ngrok tunnel\n\n#### Events\n\nUse the exported `CallbackHandlerEventNames` constants for type-safe event handling.\n\n- `CallbackHandlerEventNames.LOG` (`'log'`) - Emitted for general log messages.\n  - `data`: `LogEventData` (`{ level: 'info' | 'warn' | 'error', message: string | Error }`)\n- `CallbackHandlerEventNames.CALLBACK` (`'callback'`) - Emitted when a callback is received on the `/callback` endpoint.\n  - `data`: `CallbackEventData` (`{ level: 'info', queryParameters: any, body: any }`)\n- `CallbackHandlerEventNames.TUNNEL_STATUS` (`'tunnelStatus'`) - Emitted when the tunnel status changes (e.g., connection established, error) or provides the initial URL.\n  - `data`: `TunnelStatusEventData` (`{ level: 'info' | 'error', message: string | Error }`)\n\n## Automatic Port Finding\n\nThe CallbackHandler automatically finds an available port if the specified port is in use. This means you don't have to worry about port conflicts when starting the server. If the default port (4000) or your specified port is already in use, the server will increment the port number and try again until it finds an available port.\n\n## Custom Domains\n\nNgrok allows you to use custom domains with paid plans. This gives you a consistent URL for your callbacks, which is useful for:\n\n- Configuring webhooks in third-party services without updating them each time you restart\n- Sharing a stable URL with team members\n- Testing with consistent URLs across development sessions\n- Creating a more professional appearance for demos\n\nTo use a custom domain:\n\n```javascript\n// Option 1: Pass the custom domain in the constructor\nasync function startWithCustomDomain() {\n  try {\n    const callbackHandler = new CallbackHandler({\n      ngrokAuthToken: 'your-ngrok-auth-token',\n      customDomain: 'your-domain.ngrok.dev'\n    });\n    const publicUrl = await callbackHandler.start();\n    console.log(`Custom domain callback URL: ${publicUrl}`);\n    // Use this URL in your API requests\n  } catch (error) {\n    console.error('Failed to start with custom domain:', error);\n  }\n}\n\n// Option 2: Use environment variables\nasync function startWithOptionalCustomDomain() {\n  const ngrokAuthToken = process.env.NGROK_AUTH_TOKEN;\n  const customDomain = process.env.NGROK_CUSTOM_DOMAIN;\n  \n  if (!ngrokAuthToken) {\n    console.error('NGROK_AUTH_TOKEN environment variable is required');\n    return;\n  }\n  \n  try {\n    const callbackHandler = new CallbackHandler({\n      ngrokAuthToken,\n      customDomain: customDomain || undefined\n    });\n    const publicUrl = await callbackHandler.start();\n    console.log(`Callback URL: ${publicUrl}`);\n    // Use this URL in your API requests\n  } catch (error) {\n    console.error('Failed to start callback handler:', error);\n  }\n}\n```\n\nNote: Custom domains require a paid Ngrok plan. See [ngrok.com/pricing](https://ngrok.com/pricing) for details.\n\n## Automatic Content Type Conversion\n\nThe CallbackHandler automatically converts `application/x-www-form-urlencoded` request bodies to JSON objects. This is particularly useful when working with services like Twilio that send callbacks in URL-encoded format by default.\n\nWhen a request with `Content-Type: application/x-www-form-urlencoded` is received:\n\n1. The Express middleware parses the URL-encoded body\n2. The CallbackHandler converts it to a proper JSON object\n3. The converted JSON object is passed to your callback event handler\n4. A log event is emitted indicating the conversion occurred\n\nThis means you can work with a consistent JSON format in your callback handlers regardless of how the data was originally sent, simplifying your code.\n\n```javascript\ncallbackHandler.on('callback', (data) => {\n  // data.body is always a JSON object, even if the original request\n  // was sent as application/x-www-form-urlencoded\n  console.log('Received callback data:', data.body);\n  \n  // Process the data as JSON\n  if (data.body.status === 'completed') {\n    // Handle completed status\n  }\n});\n```\n\n## Example: Using with MCP Servers\n\nThis utility is particularly useful for MCP (Model Context Protocol) servers that need to receive callbacks from external services.\n\n```javascript\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { CallbackHandler } from '@deshartman/mcp-status-callback';\n\n// Set up the callback handler with required options\nconst callbackHandler = new CallbackHandler({\n  ngrokAuthToken: 'your-ngrok-auth-token',\n  customDomain: 'your-custom-domain.ngrok.dev' // Optional\n});\n\n// Start the callback handler and get the URL directly from the Promise\nasync function setupCallbackHandler() {\n  try {\n    // start() now returns the public URL directly\n    const callbackUrl = await callbackHandler.start();\n    console.log(`Callback URL ready: ${callbackUrl}`);\n    // Now you can use the callbackUrl in your MCP server tools\n    // setupMcpServerWithCallback(callbackUrl);\n    return callbackUrl;\n  } catch (error) {\n    console.error('Failed to start callback handler:', error);\n    throw error;\n  }\n}\n\n// You can also use the tunnelStatus event as before\ncallbackHandler.on('tunnelStatus', (data) => {\n  if (data.level === 'info') {\n    console.log(`Tunnel status update: ${data.message}`);\n  }\n});\n\n// Use the callback URL in your MCP server tools\nsetupCallbackHandler().then(url => {\n  // Use the URL in your MCP server configuration\n});\n```\n\n## Publishing\n\nThis package is published with a scope. To publish updates:\n\n```bash\n# Build the package\nnpm run build\n\n# Publish to npm (first time)\nnpm publish --access=public\n\n# For subsequent updates\nnpm publish\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}