{
  "schemaVersion": "1.0",
  "item": {
    "slug": "justinx",
    "name": "justinX",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/rsafaya-edrv/justinx",
    "canonicalUrl": "https://clawhub.ai/rsafaya-edrv/justinx",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/justinx",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=justinx",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "_meta.json",
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-07T17:22:31.273Z",
      "expiresAt": "2026-05-14T17:22:31.273Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=afrexai-annual-report",
        "contentDisposition": "attachment; filename=\"afrexai-annual-report-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/justinx"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/justinx",
    "agentPageUrl": "https://openagent3.xyz/skills/justinx/agent",
    "manifestUrl": "https://openagent3.xyz/skills/justinx/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/justinx/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "justinx",
        "body": "Use justinx for real-time streaming data -- MQTT brokers, Kafka topics, webhooks -- piped directly into your AI agent via MCP. Connect a data source, read live messages, set up automated alerts and anomaly detection, and get WebSocket URLs to embed in generated apps."
      },
      {
        "title": "When to use this skill",
        "body": "You need to connect to an MQTT broker (IoT sensors, industrial telemetry, smart devices)\nYou need to consume from Kafka topics\nYou need a webhook endpoint to receive pushed data\nYou want to build a live dashboard on streaming data\nYou need automated alerting or anomaly detection on a data stream\nYou want a WebSocket URL that any frontend can subscribe to for real-time updates"
      },
      {
        "title": "1. Get an API key",
        "body": "Sign up at https://justinx.ai and copy your API key from Dashboard > Settings."
      },
      {
        "title": "2. Configure the MCP server",
        "body": "Add JustinX as an MCP server. Choose one of the following methods depending on your environment.\n\nDirect MCP config (Claude Code, Cursor, or any MCP client):\n\nAdd to your MCP settings (e.g. .claude/settings.json, ~/.openclaw/openclaw.json, or your tool's MCP config):\n\n{\n  \"mcpServers\": {\n    \"justinx\": {\n      \"url\": \"https://api.justinx.ai/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n\nVia mcporter (if you have the mcporter skill installed):\n\nmcporter add justinx --url https://api.justinx.ai/mcp --header \"Authorization: Bearer YOUR_API_KEY\"\n\nThen call tools with:\n\nmcporter call justinx.list_connections\nmcporter call justinx.create_connection type=mqtt broker=broker.emqx.io topics='[\"sensors/#\"]'"
      },
      {
        "title": "Tools reference",
        "body": "ToolPurposecreate_connectionConnect to MQTT broker, Kafka cluster, or create a webhook endpointlist_connectionsList all active connections with status and WebSocket URLsget_connectionGet a specific connection's status, message count, and WebSocket URLdestroy_connectionTear down a connection and clean up its streamread_streamSample live entries from a connection (backfill + live window)create_watcherCreate a managed automation on a connection (alerting, aggregation)list_watchersList watchers with status, PID, and restart countget_watcherGet watcher details and configurationget_watcher_logsRead stdout/stderr from a running or crashed watcherupdate_watcher_configUpdate a watcher's JSON config (restarts automatically)restart_watcherRestart a stopped or crashed watcherdelete_watcherStop and remove a watcher"
      },
      {
        "title": "Connect to an MQTT broker and read data",
        "body": "# Connect to a public IoT demo broker\ncreate_connection type=mqtt broker=broker.emqx.io port=8883 tls=true topics=[\"justinx/demo/#\"]\n\n# Read the last 5 minutes of data + 3 seconds of live entries\nread_stream connectionId=<id> backfillSeconds=300 liveSeconds=3 maxEntries=50\n\nFor a private broker with credentials:\n\ncreate_connection type=mqtt broker=my-broker.example.com port=8883 tls=true username=myuser password=mypass topics=[\"sensors/#\",\"alerts/#\"]"
      },
      {
        "title": "Create a webhook endpoint",
        "body": "# Creates an HTTP ingest URL -- POST JSON to it and messages appear in the stream\ncreate_connection type=webhook\n\n# The response includes an ingestUrl. Send data to it:\n# POST https://api.justinx.ai/connections/<id>/ingest"
      },
      {
        "title": "Connect to Kafka",
        "body": "create_connection type=kafka brokers=[\"kafka1.example.com:9092\"] kafkaTopics=[\"events\",\"logs\"]\n\n# With SASL auth:\ncreate_connection type=kafka brokers=[\"kafka.example.com:9092\"] kafkaTopics=[\"events\"] saslUsername=user saslPassword=pass ssl=true"
      },
      {
        "title": "Create a watcher for alerts",
        "body": "Watchers are managed automations that continuously monitor a connection for conditions you define — threshold alerts, metric aggregation, or notifications. Each watcher is scoped to a single connection.\n\n# Create a watcher that alerts when temperature exceeds a threshold\ncreate_watcher connectionId=<id> config='{\"threshold\": 45}'\n\n# The platform provides a script template. See https://justinx.ai/docs for\n# watcher script examples and the full scripting reference."
      },
      {
        "title": "Manage watchers",
        "body": "# List all watchers on a connection\nlist_watchers connectionId=<id>\n\n# Check logs for debugging\nget_watcher_logs connectionId=<id> watcherId=<wid>\n\n# Update threshold without redeploying\nupdate_watcher_config connectionId=<id> watcherId=<wid> config='{\"threshold\": 50}'\n\n# Restart a crashed watcher\nrestart_watcher connectionId=<id> watcherId=<wid>\n\n# Remove a watcher\ndelete_watcher connectionId=<id> watcherId=<wid>"
      },
      {
        "title": "Build a live dashboard",
        "body": "After creating a connection, use the WebSocket URL from the response to build a frontend:\n\nCall create_connection or list_connections to get the WebSocket URL\nThe WebSocket sends a backfill message on connect (recent history), then individual entry messages in real time\nEach entry has { id, fields: { topic, payload }, ts } format\nPass the WebSocket URL to any generated React/Next.js/HTML app\n\nWebSocket message format:\n\n// Backfill (sent once on connect)\n{ \"type\": \"backfill\", \"entries\": [{ \"id\": \"...\", \"fields\": { \"topic\": \"...\", \"payload\": \"...\" }, \"ts\": 1234567890 }] }\n\n// Live entry (streamed continuously)\n{ \"type\": \"entry\", \"id\": \"...\", \"fields\": { \"topic\": \"...\", \"payload\": \"...\" }, \"ts\": 1234567890 }\n\nTopic filtering: append ?topics=sensor/temp,sensor/humidity to the WebSocket URL."
      },
      {
        "title": "Tips",
        "body": "Every new account gets a demo connection to broker.emqx.io with live IoT data -- call list_connections to find it\nUse read_stream with backfillSeconds=0 liveSeconds=5 to see only fresh data\nWatcher config is passed as a JSON string and can be updated without redeploying\nWatcher alerts appear on the connection's WebSocket stream automatically\nThe WebSocket URL works from any client (browser, Node.js, Python, mobile) -- no SDK needed\nFull tool reference and parameter schemas: https://justinx.ai/llms-full.txt"
      }
    ],
    "body": "justinx\n\nUse justinx for real-time streaming data -- MQTT brokers, Kafka topics, webhooks -- piped directly into your AI agent via MCP. Connect a data source, read live messages, set up automated alerts and anomaly detection, and get WebSocket URLs to embed in generated apps.\n\nWhen to use this skill\nYou need to connect to an MQTT broker (IoT sensors, industrial telemetry, smart devices)\nYou need to consume from Kafka topics\nYou need a webhook endpoint to receive pushed data\nYou want to build a live dashboard on streaming data\nYou need automated alerting or anomaly detection on a data stream\nYou want a WebSocket URL that any frontend can subscribe to for real-time updates\nSetup\n1. Get an API key\n\nSign up at https://justinx.ai and copy your API key from Dashboard > Settings.\n\n2. Configure the MCP server\n\nAdd JustinX as an MCP server. Choose one of the following methods depending on your environment.\n\nDirect MCP config (Claude Code, Cursor, or any MCP client):\n\nAdd to your MCP settings (e.g. .claude/settings.json, ~/.openclaw/openclaw.json, or your tool's MCP config):\n\n{\n  \"mcpServers\": {\n    \"justinx\": {\n      \"url\": \"https://api.justinx.ai/mcp\",\n      \"headers\": {\n        \"Authorization\": \"Bearer YOUR_API_KEY\"\n      }\n    }\n  }\n}\n\n\nVia mcporter (if you have the mcporter skill installed):\n\nmcporter add justinx --url https://api.justinx.ai/mcp --header \"Authorization: Bearer YOUR_API_KEY\"\n\n\nThen call tools with:\n\nmcporter call justinx.list_connections\nmcporter call justinx.create_connection type=mqtt broker=broker.emqx.io topics='[\"sensors/#\"]'\n\nTools reference\nTool\tPurpose\ncreate_connection\tConnect to MQTT broker, Kafka cluster, or create a webhook endpoint\nlist_connections\tList all active connections with status and WebSocket URLs\nget_connection\tGet a specific connection's status, message count, and WebSocket URL\ndestroy_connection\tTear down a connection and clean up its stream\nread_stream\tSample live entries from a connection (backfill + live window)\ncreate_watcher\tCreate a managed automation on a connection (alerting, aggregation)\nlist_watchers\tList watchers with status, PID, and restart count\nget_watcher\tGet watcher details and configuration\nget_watcher_logs\tRead stdout/stderr from a running or crashed watcher\nupdate_watcher_config\tUpdate a watcher's JSON config (restarts automatically)\nrestart_watcher\tRestart a stopped or crashed watcher\ndelete_watcher\tStop and remove a watcher\nCommon workflows\nConnect to an MQTT broker and read data\n# Connect to a public IoT demo broker\ncreate_connection type=mqtt broker=broker.emqx.io port=8883 tls=true topics=[\"justinx/demo/#\"]\n\n# Read the last 5 minutes of data + 3 seconds of live entries\nread_stream connectionId=<id> backfillSeconds=300 liveSeconds=3 maxEntries=50\n\n\nFor a private broker with credentials:\n\ncreate_connection type=mqtt broker=my-broker.example.com port=8883 tls=true username=myuser password=mypass topics=[\"sensors/#\",\"alerts/#\"]\n\nCreate a webhook endpoint\n# Creates an HTTP ingest URL -- POST JSON to it and messages appear in the stream\ncreate_connection type=webhook\n\n# The response includes an ingestUrl. Send data to it:\n# POST https://api.justinx.ai/connections/<id>/ingest\n\nConnect to Kafka\ncreate_connection type=kafka brokers=[\"kafka1.example.com:9092\"] kafkaTopics=[\"events\",\"logs\"]\n\n# With SASL auth:\ncreate_connection type=kafka brokers=[\"kafka.example.com:9092\"] kafkaTopics=[\"events\"] saslUsername=user saslPassword=pass ssl=true\n\nCreate a watcher for alerts\n\nWatchers are managed automations that continuously monitor a connection for conditions you define — threshold alerts, metric aggregation, or notifications. Each watcher is scoped to a single connection.\n\n# Create a watcher that alerts when temperature exceeds a threshold\ncreate_watcher connectionId=<id> config='{\"threshold\": 45}'\n\n# The platform provides a script template. See https://justinx.ai/docs for\n# watcher script examples and the full scripting reference.\n\nManage watchers\n# List all watchers on a connection\nlist_watchers connectionId=<id>\n\n# Check logs for debugging\nget_watcher_logs connectionId=<id> watcherId=<wid>\n\n# Update threshold without redeploying\nupdate_watcher_config connectionId=<id> watcherId=<wid> config='{\"threshold\": 50}'\n\n# Restart a crashed watcher\nrestart_watcher connectionId=<id> watcherId=<wid>\n\n# Remove a watcher\ndelete_watcher connectionId=<id> watcherId=<wid>\n\nBuild a live dashboard\n\nAfter creating a connection, use the WebSocket URL from the response to build a frontend:\n\nCall create_connection or list_connections to get the WebSocket URL\nThe WebSocket sends a backfill message on connect (recent history), then individual entry messages in real time\nEach entry has { id, fields: { topic, payload }, ts } format\nPass the WebSocket URL to any generated React/Next.js/HTML app\n\nWebSocket message format:\n\n// Backfill (sent once on connect)\n{ \"type\": \"backfill\", \"entries\": [{ \"id\": \"...\", \"fields\": { \"topic\": \"...\", \"payload\": \"...\" }, \"ts\": 1234567890 }] }\n\n// Live entry (streamed continuously)\n{ \"type\": \"entry\", \"id\": \"...\", \"fields\": { \"topic\": \"...\", \"payload\": \"...\" }, \"ts\": 1234567890 }\n\n\nTopic filtering: append ?topics=sensor/temp,sensor/humidity to the WebSocket URL.\n\nTips\nEvery new account gets a demo connection to broker.emqx.io with live IoT data -- call list_connections to find it\nUse read_stream with backfillSeconds=0 liveSeconds=5 to see only fresh data\nWatcher config is passed as a JSON string and can be updated without redeploying\nWatcher alerts appear on the connection's WebSocket stream automatically\nThe WebSocket URL works from any client (browser, Node.js, Python, mobile) -- no SDK needed\nFull tool reference and parameter schemas: https://justinx.ai/llms-full.txt"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/rsafaya-edrv/justinx",
    "publisherUrl": "https://clawhub.ai/rsafaya-edrv/justinx",
    "owner": "rsafaya-edrv",
    "version": "1.0.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/justinx",
    "downloadUrl": "https://openagent3.xyz/downloads/justinx",
    "agentUrl": "https://openagent3.xyz/skills/justinx/agent",
    "manifestUrl": "https://openagent3.xyz/skills/justinx/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/justinx/agent.md"
  }
}