{"_id":"@cloudsignal/mcp-over-mqtt","_rev":"12-3039fb3e85d7ad78e3f1e34185e807b5","name":"@cloudsignal/mcp-over-mqtt","dist-tags":{"latest":"0.1.8"},"versions":{"0.1.0":{"name":"@cloudsignal/mcp-over-mqtt","version":"0.1.0","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"author":{"name":"CloudSignal"},"license":"MIT","_id":"@cloudsignal/mcp-over-mqtt@0.1.0","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"homepage":"https://cloudsignal.io","bugs":{"url":"https://github.com/cloudsignal/mcp-over-mqtt/issues"},"dist":{"shasum":"c30cb6927c26c85352f1c464a27e87696cfe552c","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.0.tgz","fileCount":9,"integrity":"sha512-fXUNYvQlkjglsZiTmiIZHKTfI+LO0knx9on2mrUtYwuHiJaGZrX0xcrqTkheD8DdNaI9rXM9052QozLFScCarA==","signatures":[{"sig":"MEYCIQDEGkSxXbqY7wpQvpK4XJDHHO7ba+nKJCdAeU4rC6aKggIhANmKYujMPHkl7I+ToDruRIjNQjF4voeys4XpX062MOb/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151924},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"caf160ee8729cb522412962b8529a9a8db33e1f5","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"deprecated":"Deprecated due to internal-content disclosure. Install the latest version of this package.","repository":{"url":"git+https://github.com/cloudsignal/mcp-over-mqtt.git","type":"git"},"_npmVersion":"10.9.3","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.2"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-over-mqtt_0.1.0_1777066346848_0.8439328403429702","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@cloudsignal/mcp-over-mqtt","version":"0.1.1","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"author":{"name":"CloudSignal"},"license":"MIT","_id":"@cloudsignal/mcp-over-mqtt@0.1.1","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"homepage":"https://cloudsignal.io","bugs":{"url":"https://github.com/cloudsignal/mcp-over-mqtt/issues"},"dist":{"shasum":"f56825661eede08685d0773c2c85866de0875deb","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.1.tgz","fileCount":9,"integrity":"sha512-MlUHBcipTmMJ8CQi6qPLhna05qudOxXdlaXByP9qcreWAA3YGuwVqp8pLw3NOk8qWGDEhTr5RRO0w1cgNZCWWQ==","signatures":[{"sig":"MEQCIBA5u9UTELMtu/v2iF7ITgCQTvrQH4cpMYa7ol4Zq6a/AiBPPIGT6W6LIcLcbCoZXGPr4gtSHHuypOQ+O9Jk0pF1SA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":151944},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"caf160ee8729cb522412962b8529a9a8db33e1f5","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build"},"_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"deprecated":"Deprecated due to internal-content disclosure. Install the latest version of this package.","repository":{"url":"git+https://github.com/cloudsignal/mcp-over-mqtt.git","type":"git"},"_npmVersion":"10.9.3","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"sideEffects":false,"_nodeVersion":"22.19.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.2"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-over-mqtt_0.1.1_1777196695238_0.5259133872969293","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@cloudsignal/mcp-over-mqtt","version":"0.1.3","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"author":{"name":"CloudSignal"},"license":"MIT","_id":"@cloudsignal/mcp-over-mqtt@0.1.3","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"homepage":"https://cloudsignal.io","dist":{"shasum":"7f04afb7b356b46701edc1bdbd9f4826df65395c","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.3.tgz","fileCount":7,"integrity":"sha512-gvWmpgftchrpjLh6REzvzg0DQgY33o0cKl/NSQfo0dPkn0N/3cgjNkVKFt1QfikeNNZ4E2bww31jlgvTjyjZug==","signatures":[{"sig":"MEUCIFCD9qCH08kpZjv5Hc0XuaKaHEBIt6b5eULjsNMUbQGrAiEAg8q+06Bc3z7JH2vl320XZDBaAchOm+IZrrIGQ4HUj5I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67223},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"ee3834b6f0e57d3daf13edab4b8eb154a28e530f","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build && bash ../scripts/check-publish-safe.sh ."},"_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"deprecated":"Broken ESM/CJS interop with @cloudsignal/mqtt-client (TypeError: CloudSignalClient is not a constructor). Install @latest. See CLO-126.","_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.2"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-over-mqtt_0.1.3_1777532134470_0.5169846215759042","host":"s3://npm-registry-packages-npm-production"}},"0.1.4":{"name":"@cloudsignal/mcp-over-mqtt","version":"0.1.4","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"author":{"name":"CloudSignal"},"license":"MIT","_id":"@cloudsignal/mcp-over-mqtt@0.1.4","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"homepage":"https://cloudsignal.io","dist":{"shasum":"ff0decfd1e6ef1fc033958eea795ec2677e9e46f","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.4.tgz","fileCount":7,"integrity":"sha512-7HywvfzsLFavadSyy9lPXsDpVGrsftutGHM/ISzPBMpA9zcY1QSN0JRUoyJVuMgEaMh2LpKXZVuw422H/XGgNw==","signatures":[{"sig":"MEYCIQCqGbBZRwkLzt4lUs+VPoqegTZG1G312qEFoOj/sI9FSgIhALDVltRJ35y4P418stKlHHGISvHWBEQmb6HYr/3nogvn","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67511},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"a2f5c220f6a7bdbc9c5b24c3698bf8419705aac3","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build && bash ../scripts/check-publish-safe.sh ."},"_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.2"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-over-mqtt_0.1.4_1777575941275_0.9384942418240749","host":"s3://npm-registry-packages-npm-production"}},"0.1.5":{"name":"@cloudsignal/mcp-over-mqtt","version":"0.1.5","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"author":{"name":"CloudSignal"},"license":"MIT","_id":"@cloudsignal/mcp-over-mqtt@0.1.5","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"homepage":"https://cloudsignal.io","dist":{"shasum":"7a2ff16fdd1858143fdcab5aeb8100d0cee2c329","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.5.tgz","fileCount":7,"integrity":"sha512-/p5Sfw2UaSssPbIefApRfA8KaTpo31rqsRUxj+RVnAbNxuAevI64t77AEyKUbsBMFO8WT8fh9PDv8UTgAap2Hg==","signatures":[{"sig":"MEUCIQC6zbzwi99Dj7U0nIFbtD7nnQTjnxrp88TxaIRNDTWdmgIgJ0AvB05cH45AYqssw3mQb1cBisLMbmCsgZRupKtWFnc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":67555},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"fa05f0403bdcab3425dd48ae909a320e5cae628b","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build && bash ../scripts/check-publish-safe.sh . && node ../scripts/smoke-test-interop.mjs ."},"_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.2"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-over-mqtt_0.1.5_1777576211046_0.7466908374525172","host":"s3://npm-registry-packages-npm-production"}},"0.1.6":{"name":"@cloudsignal/mcp-over-mqtt","version":"0.1.6","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"author":{"name":"CloudSignal"},"license":"MIT","_id":"@cloudsignal/mcp-over-mqtt@0.1.6","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"homepage":"https://cloudsignal.io","bugs":{"url":"https://github.com/cloudsignal/mcp-over-mqtt/issues"},"dist":{"shasum":"78b20ebd7c2e42d4b37479846dbd1ea6341f6165","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.6.tgz","fileCount":10,"integrity":"sha512-5sEASb1CKUIBARfMJA59JSDigCJgdxBC57eMOXH7yIkIid+KCFB5Ro0pPiCQgSJB3a+PpoUKYMoKukv/V2isgg==","signatures":[{"sig":"MEUCIEXakulJRtRThOxLa8ar9MxDLp2Fdy70fieZgN2GWB6XAiEAn3Q6Ke7JYJfg2ZGBe2KamtOCh/vq5JXJsNm0u1Z0q4A=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84036},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"d6ecf15268c83c7ec061454a9edefb47c6399a2a","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build && bash ../scripts/check-publish-safe.sh . && node ../scripts/smoke-test-interop.mjs ."},"_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"repository":{"url":"git+https://github.com/cloudsignal/mcp-over-mqtt.git","type":"git"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.2"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-over-mqtt_0.1.6_1782430607146_0.2780886565318439","host":"s3://npm-registry-packages-npm-production"}},"0.1.7":{"name":"@cloudsignal/mcp-over-mqtt","version":"0.1.7","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"author":{"name":"CloudSignal"},"license":"MIT","_id":"@cloudsignal/mcp-over-mqtt@0.1.7","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"homepage":"https://cloudsignal.io","bugs":{"url":"https://github.com/cloudsignal/mcp-over-mqtt/issues"},"dist":{"shasum":"0869334aaf6a99aa18f757e9b68575005d2f12ef","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.7.tgz","fileCount":10,"integrity":"sha512-L/qqrfhW8aIf6j2WZS+7ibAuytRz/uSyFpcAcqiVHPWyXPyxBAJ3IHPl31dMCid1bPDDuuz4ClHKBhrdF6+A9Q==","signatures":[{"sig":"MEYCIQDCOvVawGDG15atfhx3JfazZhD7EG3tbbTNBEZV0ZMSfgIhAIf1nVAAwbrvWQqJfnryYOPPBZbV0VHOUk2xaykbqwNC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":84036},"main":"dist/index.cjs","type":"module","types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"8bd5347c4a9fef5d4745b64707d5287ac3090044","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build && bash ../scripts/check-publish-safe.sh . && node ../scripts/smoke-test-interop.mjs ."},"_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"repository":{"url":"git+https://github.com/cloudsignal/mcp-over-mqtt.git","type":"git"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.5"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.5"},"_npmOperationalInternal":{"tmp":"tmp/mcp-over-mqtt_0.1.7_1785543182161_0.26240587114237623","host":"s3://npm-registry-packages-npm-production"}},"0.1.8":{"_id":"@cloudsignal/mcp-over-mqtt@0.1.8","bugs":{"url":"https://github.com/cloudsignal/mcp-over-mqtt/issues"},"dist":{"shasum":"25158eeca2c63182688f61eca3665d7af0a1baa2","tarball":"https://registry.npmjs.org/@cloudsignal/mcp-over-mqtt/-/mcp-over-mqtt-0.1.8.tgz","fileCount":10,"integrity":"sha512-VlRnu+hBGJSFehs7ed2ENqGpBrzAy4pn6mg2VSc+DSGTjlvwsNpZpDYojQclch3dubVJGFY6rDEHcIeCAZ9MRA==","signatures":[{"sig":"MEYCIQDtOkPgESQV//TaK+lFXqKwoe9eRglOJSQlH9HvIpWhxAIhAIrABPifNbXKQmBspBXZv5e/VyaPquZwn+08fkgmFaEB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCtnf9GKDCbvzlz2YjYhOFVcSULBZ5llB63mJFNcioJeAIhAMK84np7Qniw3UEW44uzvwXiRpHjBjmCkHyZZORcUg4O"}],"unpackedSize":92184},"main":"dist/index.cjs","name":"@cloudsignal/mcp-over-mqtt","type":"module","types":"dist/index.d.ts","author":{"name":"CloudSignal"},"module":"dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"gitHead":"9eb1fdac7eb905710b54f10dff3a7c2a375ecde4","license":"MIT","scripts":{"build":"tsup","clean":"rm -rf dist","typecheck":"tsc --noEmit","prepublishOnly":"npm run clean && npm run build && bash ../scripts/check-publish-safe.sh . && node ../scripts/smoke-test-interop.mjs ."},"version":"0.1.8","_npmUser":{"name":"nocoderoi","email":"info@nocoderoi.com"},"homepage":"https://cloudsignal.io","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"repository":{"url":"git+https://github.com/cloudsignal/mcp-over-mqtt.git","type":"git"},"_npmVersion":"10.8.2","description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","directories":{},"maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","typescript":"^5.9.3","@types/node":"^22","@cloudsignal/mqtt-client":"^2.2.5"},"peerDependencies":{"@cloudsignal/mqtt-client":">=2.2.5"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-over-mqtt_0.1.8_1789907902749_0.7791221987269994"}}},"time":{"created":"2026-04-24T21:32:26.736Z","modified":"2026-09-20T12:38:23.099Z","0.1.0":"2026-04-24T21:32:26.990Z","0.1.1":"2026-04-26T09:44:55.372Z","0.1.2":"2026-04-29T19:33:18.126Z","0.1.3":"2026-04-30T06:55:34.617Z","0.1.4":"2026-04-30T19:05:41.412Z","0.1.5":"2026-04-30T19:10:11.190Z","0.1.6":"2026-06-25T23:36:47.319Z","0.1.7":"2026-08-01T00:13:02.304Z","0.1.8":"2026-09-20T12:38:22.849Z"},"bugs":{"url":"https://github.com/cloudsignal/mcp-over-mqtt/issues"},"author":{"name":"CloudSignal"},"license":"MIT","homepage":"https://cloudsignal.io","keywords":["mqtt","mqtt5","mcp","model-context-protocol","ai-agent","agent-tools","cloudsignal","typescript"],"repository":{"url":"git+https://github.com/cloudsignal/mcp-over-mqtt.git","type":"git"},"description":"Model Context Protocol (MCP) over MQTT 5 — reference implementation and draft protocol spec, with per-tool broker-enforced ACL.","maintainers":[{"name":"nocoderoi","email":"info@nocoderoi.com"}],"readme":"# @cloudsignal/mcp-over-mqtt\n\n**MCP over MQTT** — a reference implementation of the Model Context Protocol\nusing MQTT 5 as the transport, with a draft protocol spec. Ships with\nbroker-enforced per-tool ACL (identity-bound) so a compromised agent can\nonly call tools it's authorized for — enforcement is at the wire, not in\napplication code.\n\n- **Protocol-first:** [SPEC.md](./SPEC.md) defines the wire protocol.\n- **Production-validated:** running in the CloudSignal GTM agent system.\n- **Broker-agnostic API:** designed for any MQTT 5 broker. v1.0 will verify EMQX, HiveMQ, Mosquitto.\n- **Companion to `@cloudsignal/agent`:** shares the same namespace and ACL model — A2A + MCP on a single broker.\n\n## Install\n\n```bash\nnpm install @cloudsignal/mcp-over-mqtt @cloudsignal/mqtt-client\n```\n\n## Before your first `start()`: assign `agent_id`\n\nEvery identity needs an `agent_id` claim assigned **before it first connects**,\nor it fails closed on every ACL rule that binds to one. `start()` cannot do this\nfor you and the claim is never inferred from the email address. It is a one-time\nstep per identity, and the pre-connect call differs between secret-key and\nexternal-IdP identities. Full recipe: [PROMPT.md](./PROMPT.md#first-time-provisioning-assign-the-agent_id-claim-before-start).\n\nBoth quickstarts below call `start()` directly, so read them as the shape of the\ncode and not as a first run.\n\n## Quickstart — server\n\n```ts\nimport { MCPServer, defineTool } from '@cloudsignal/mcp-over-mqtt';\n\nconst queryWatchConfigs = defineTool({\n  name: 'query_watch_configs',\n  description: 'List active watch configurations',\n  input_schema: {\n    type: 'object',\n    properties: {\n      platform: { type: 'string' },\n    },\n    additionalProperties: false,\n  },\n  allowed_callers: ['scout', 'analyst'],\n  handler: async (args, ctx) => {\n    console.log(`[${ctx.client}] querying with`, args);\n    // return real data from your DB\n    return { configs: [] };\n  },\n});\n\nconst server = new MCPServer({\n  name: 'gtm-mcp-server',\n  namespace: 'gtm',\n  tools: [queryWatchConfigs],\n  broker: 'mqtts://connect.cloudsignal.app:8883',\n  credentials: {\n    orgId: 'org_...',\n    secretKey: 'sk_...',\n    userEmail: 'mcp-server@gtm.cloudsignal.app',\n    tokenServiceUrl: 'https://auth.cloudsignal.app',\n  },\n});\n\nawait server.start();\n```\n\n## Quickstart — client\n\n```ts\nimport { MCPClient } from '@cloudsignal/mcp-over-mqtt';\n\nconst client = new MCPClient({\n  clientId: 'scout',\n  namespace: 'gtm',\n  broker: 'mqtts://connect.cloudsignal.app:8883',\n  credentials: { /* same shape as server */ },\n});\n\nawait client.start();\n\nconst result = await client.call('query_watch_configs', { platform: 'reddit' });\nconsole.log(result);\n```\n\n## Streaming\n\nTools that want to emit intermediate output:\n\n```ts\nconst longRunning = defineTool({\n  name: 'crawl_site',\n  description: 'Crawl a website, emitting progress',\n  supports_streaming: true,\n  input_schema: { type: 'object', properties: { url: { type: 'string' } } },\n  handler: async ({ url }, ctx) => {\n    for (let i = 0; i < 10; i++) {\n      await ctx.stream?.(`Crawled ${i * 10}%`);\n      await new Promise((r) => setTimeout(r, 500));\n    }\n    return { url, pages_scraped: 42 };\n  },\n});\n```\n\nClient subscribes to the stream:\n\n```ts\nconst result = await client.call('crawl_site', { url: 'https://example.com' }, {\n  onStream: (partial) => console.log('progress:', partial),\n  timeoutMs: 120_000,\n});\n```\n\n## Security — the real story\n\nThe unique value: broker-level per-tool ACL. ACL v2 policy example:\n\n```json\n{\n  \"rules\": [\n    { \"topic\": \"gtm/mcp/tools/query_watch_configs/call\",\n      \"action\": \"pub\", \"binding\": \"agent_id\",\n      \"agents\": [\"scout\", \"analyst\"] },\n    { \"topic\": \"gtm/mcp/tools/create_social_post/call\",\n      \"action\": \"pub\", \"binding\": \"agent_id\",\n      \"agents\": [\"operator\"] },\n    { \"topic\": \"gtm/mcp/clients/{$self}/responses\",\n      \"action\": \"sub\", \"binding\": \"agent_id\" }\n  ]\n}\n```\n\nScout CANNOT call `create_social_post` — the broker rejects the publish.\n\n`binding: agent_id` matches against the identity's `agent_id` claim, which you\nassign explicitly once per identity, **before its first `start()`**:\n\n```bash\n# Pre-create the identity first, using the mode it will connect with:\n#   secret key  -> POST /v2/tokens/create   {organization_id, secret_key, user_email}\n#   external IdP-> POST /v2/tokens/exchange {organization_id, token}\n# These key different rows, so the wrong one assigns the claim to a row the\n# agent never connects as. Both return mqtt_credentials.username as\n# \"<generated>@org_k7xm4pqr2n5t\"; the claims API takes the BARE username, so\n# strip the \"@<orgId>\" suffix first.\ncurl -X PATCH \"https://api.cloudsignal.app/v2/users/${MQTT_USERNAME}/claims\" \\\n  -H \"Authorization: Bearer sk_your_secret_key\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"agent_id\": \"scout\"}'\n```\n\nAn identity with no `agent_id` fails closed on every rule above, which is the\nintended default. The claim is never inferred from the email address: an\naddress is not proof of identity, and `agent_id` decides what the identity may\npublish. Assign it before connecting, not after: authorization decisions are\ncached for up to five minutes. Reissuance preserves the claim, so this is a\none-time step per identity, not per run. Full flow: see PROMPT.md.\nNo application-layer trust needed. An exploited agent can only touch tools\nit was authorized for.\n\n## Protocol\n\nSee [SPEC.md](./SPEC.md) — topic structure, Tool Card schema, call/response\nenvelopes, security model, MQTT 3.1.1 compatibility, interop with A2A over MQTT.\n\nDRAFT spec, v0.1. Stabilized in v1.0.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}