{"ok":true,"site":{"host":"ryanbateman.github.io","url":"https://ryanbateman.github.io/mqtt_vis/","type":"live","desc":"MQTT Visualiser","tools":[{"name":"getTopicTree","kind":"answer","impl":"imperative","description":"Get the MQTT topic tree structure with message rates and counts. For large trees (1000+ topics), use maxDepth to limit the response size. Defaults to maxDepth=5 if not specified.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"maxDepth":{"type":"number","description":"Maximum tree depth to return. Defaults to 5. Child nodes beyond this depth are omitted but their existence is indicated by the parent's childCount field."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"getActiveTopics","kind":"answer","impl":"imperative","description":"List topics that are currently receiving messages, sorted by direct message rate. Use this to find which specific leaf topics are actively publishing right now. For finding the busiest areas of the topic tree including aggregate subtree activity, use getNoisyTopics instead.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"minRate":{"type":"number","description":"Minimum direct message rate (messages/sec) to include. Defaults to 0, which excludes only truly idle topics."},"limit":{"type":"number","description":"Maximum number of topics to return. Defaults to 20."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"findTopics","kind":"answer","impl":"imperative","description":"Search for topics whose path contains the given substring (case-insensitive). For example, pattern 'kitchen' matches 'home/kitchen/temp'. Optionally filter by minimum message rate and depth range.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"pattern":{"type":"string","description":"Substring to match against topic paths (case-insensitive)."},"minRate":{"type":"number","description":"Minimum direct message rate to include. Defaults to 0."},"minDepth":{"type":"number","description":"Minimum tree depth to include. Defaults to 0."},"maxDepth":{"type":"number","description":"Maximum tree depth to include. Defaults to no limit."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"getTopicDetails","kind":"answer","impl":"imperative","description":"Get detailed information about a specific MQTT topic including its current message rate, aggregate rate, last payload, QoS level, and child count.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"topicId":{"type":"string","description":"Full topic path, e.g. 'home/kitchen/temp'. Required."}},"required":["topicId"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"getStats","kind":"answer","impl":"imperative","description":"Get aggregate MQTT traffic statistics for the current session including total messages, unique topics, uptime, connection status, and the top 10 most active topics by aggregate rate.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"getNoisyTopics","kind":"answer","impl":"imperative","description":"List the highest-traffic areas of the topic tree, ranked by aggregate rate (the node's own rate plus all descendants). Use this to find which branches or subtrees are generating the most total traffic. For finding specific leaf topics that are actively publishing, use getActiveTopics instead. Use leafOnly=true to restrict results to leaf nodes (no children) — useful for highlighting actual publishers rather than aggregate branch nodes. Use mustHaveMessages=true to exclude structural intermediate nodes that have never received a direct message on that exact topic path.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Maximum number of topics to return. Defaults to 10."},"leafOnly":{"type":"boolean","description":"If true, only return leaf nodes (nodes with no children). Excludes intermediate branch nodes whose traffic is entirely aggregated from descendants. Defaults to false."},"mustHaveMessages":{"type":"boolean","description":"If true, only return nodes that have received at least one message directly on that exact topic path (messageCount > 0). Excludes structural intermediate nodes that exist only as path segments and have never been published to directly. Defaults to false."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"getLargestPayloads","kind":"answer","impl":"imperative","description":"List topics with the largest payloads ever observed, ranked by largestPayloadSize (high-water mark) descending. Useful for identifying topics that publish large data blobs and for debugging payload size issues. lastPayloadSize reflects the most recent message; largestPayloadSize is the all-time maximum. Both are character counts. Note: size tracking is unconditional — sizes are recorded even when tooltip storage is disabled and even after the payload itself has been evicted from the LRU cache.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{"limit":{"type":"number","description":"Maximum number of topics to return. Defaults to 20, max 200."},"minSize":{"type":"number","description":"Only include topics whose largestPayloadSize is at least this many characters. Defaults to 0 (all topics with messages)."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"exportGraph","kind":"act","impl":"imperative","description":"Export the current graph visualisation as a PNG image. This triggers a file download in the browser.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"highlightNodes","kind":"act","impl":"imperative","description":"Highlight one or more nodes in the graph with a coloured ring. Replaces any existing highlights — call again with a new set to update, or use clearHighlights to remove all rings. The highlight ring appears just outside the node circle and is visible alongside any selection ring the user may have active. Topic IDs must match the full path as seen in the visualiser (e.g. 'home/kitchen/temp'). Unknown topics are silently skipped and reported in the response.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{"nodeIds":{"type":"array","items":{"type":"string"},"description":"Array of full topic path strings to highlight. Maximum 200 entries — excess entries are silently dropped."},"color":{"type":"string","description":"CSS hex colour for the highlight ring, e.g. '#cc0000'. Accepts #rgb and #rrggbb formats. Defaults to '#cc0000' (red)."}},"required":["nodeIds"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"},{"name":"clearHighlights","kind":"act","impl":"imperative","description":"Remove all node highlight rings from the graph. Has no effect if no highlights are currently active.","annotations":{"readOnlyHint":false},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/mqtt_vis/"}],"category":"Developer Tools","favicon":"/favicons/ryanbateman.github.io.svg","apiSurface":"spec","toolCount":10}}