{
  "schemaVersion": "1.0",
  "item": {
    "slug": "snapmaker-2",
    "name": "Snapmaker 2",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/odrobnik/snapmaker-2",
    "canonicalUrl": "https://clawhub.ai/odrobnik/snapmaker-2",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/snapmaker-2",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=snapmaker-2",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/API_NOTES.md",
      "scripts/monitor.py",
      "scripts/snapmaker.py"
    ],
    "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",
      "slug": "snapmaker-2",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-05-09T04:50:07.491Z",
      "expiresAt": "2026-05-16T04:50:07.491Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=snapmaker-2",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=snapmaker-2",
        "contentDisposition": "attachment; filename=\"snapmaker-2-1.2.2.zip\"",
        "redirectLocation": null,
        "bodySnippet": null,
        "slug": "snapmaker-2"
      },
      "scope": "item",
      "summary": "Item download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this item.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/snapmaker-2"
    },
    "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/snapmaker-2",
    "agentPageUrl": "https://openagent3.xyz/skills/snapmaker-2/agent",
    "manifestUrl": "https://openagent3.xyz/skills/snapmaker-2/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/snapmaker-2/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": "Snapmaker 2.0 Skill",
        "body": "Control and monitor Snapmaker 2.0 3D printers via their HTTP API."
      },
      {
        "title": "Features",
        "body": "Status monitoring - Real-time printer status (temperatures, progress, position)\nJob management - Send, start, pause, resume, and stop print jobs\nSafety features - Prevents interfering with active prints without confirmation\nProgress watching - Live monitoring of print progress\nNotification support - Detect print completion, filament issues, errors"
      },
      {
        "title": "Configuration",
        "body": "Create config.json in your workspace's snapmaker/ folder (e.g. ~/clawd/snapmaker/config.json).\nStart from config.json.example.\n\nConfig format:\n\n{\n  \"ip\": \"192.168.0.32\",\n  \"token\": \"your-token-here\",\n  \"port\": 8080\n}\n\nFinding your token:\nOpen the Snapmaker Luban app, connect to your printer, and find the token\nin the connection settings. Copy it into your config.json."
      },
      {
        "title": "Discovery",
        "body": "# Find Snapmaker printers on the local network (UDP broadcast, port 20054)\npython3 scripts/snapmaker.py discover\n\n# Probe a specific IP (useful across subnets)\npython3 scripts/snapmaker.py discover --target 192.168.0.32\n\n# JSON output\npython3 scripts/snapmaker.py discover --json\n\nDiscovery uses the Snapmaker UDP broadcast protocol (no auth required).\nFalls back to HTTP probe using config if UDP gets no reply (e.g. different subnet)."
      },
      {
        "title": "Basic Commands",
        "body": "# Get current printer status\npython3 scripts/snapmaker.py status\n\n# Watch print progress (updates every 5 seconds)\npython3 scripts/snapmaker.py watch\n\n# Get status as JSON\npython3 scripts/snapmaker.py status --json"
      },
      {
        "title": "Job Control",
        "body": "# Send a file (prepares but doesn't start)\npython3 scripts/snapmaker.py send ~/prints/model.gcode\n\n# Send and start immediately\npython3 scripts/snapmaker.py send ~/prints/model.gcode --start --yes\n\n# Pause current print\npython3 scripts/snapmaker.py pause --yes\n\n# Resume paused print\npython3 scripts/snapmaker.py resume --yes\n\n# Stop/cancel print (requires confirmation)\npython3 scripts/snapmaker.py stop"
      },
      {
        "title": "Safety Flags",
        "body": "--yes - Skip confirmation prompts (use with caution!)\n--force - Override safety checks (NOT RECOMMENDED)\n\nAll commands that modify state require confirmation unless --yes is provided."
      },
      {
        "title": "API Endpoints",
        "body": "The skill uses these Snapmaker HTTP API v1 endpoints:\n\nPOST /api/v1/connect - Establish connection\nGET /api/v1/status - Get printer status\nPOST /api/v1/prepare_print - Upload file\nPOST /api/v1/start_print - Start printing\nPOST /api/v1/pause - Pause print\nPOST /api/v1/resume - Resume print\nPOST /api/v1/stop - Stop/cancel print\nGET /api/v1/print_file - Download last file"
      },
      {
        "title": "Status Fields",
        "body": "The status command returns:\n\nstatus - Overall state (IDLE, RUNNING, PAUSED)\nprintStatus - Printing / Idle\nprogress - 0.0 to 1.0\nfileName - Current/last file\ncurrentLine / totalLines - G-code progress\nelapsedTime / remainingTime - In seconds\nnozzleTemperature1 / nozzleTargetTemperature1\nheatedBedTemperature / heatedBedTargetTemperature\nx / y / z - Current position\nisFilamentOut - Filament runout detection\nisEnclosureDoorOpen - Door state"
      },
      {
        "title": "Notifications",
        "body": "To detect events:\n\n# Watch for completion\npython3 scripts/snapmaker.py watch\n\n# Or poll status in a loop\nwhile true; do\n  python3 scripts/snapmaker.py status --json | jq -r '.printStatus'\n  sleep 10\ndone\n\nEvent detection:\n\nPrint complete - status == \"IDLE\" && progress >= 0.99\nFilament out - isFilamentOut == true\nDoor opened - isEnclosureDoorOpen == true\nError - Check status field for errors"
      },
      {
        "title": "Safety Features",
        "body": "Active print protection - Cannot send files while printing\nConfirmation prompts - All destructive actions require confirmation\nState validation - Commands check printer state before executing\nClear warnings - Stop command shows prominent warning"
      },
      {
        "title": "Check if printer is busy",
        "body": "python3 scripts/snapmaker.py status | grep -q \"RUNNING\" && echo \"Busy\" || echo \"Available\""
      },
      {
        "title": "Get remaining time",
        "body": "python3 scripts/snapmaker.py status --json | jq -r '.remainingTime'"
      },
      {
        "title": "Monitor temperatures",
        "body": "python3 scripts/snapmaker.py status --json | jq '{nozzle: .nozzleTemperature1, bed: .heatedBedTemperature}'"
      },
      {
        "title": "Troubleshooting",
        "body": "\"Machine is not connected yet\" (401 error):\n\nThe API requires calling /api/v1/connect first before any status queries\nExample: curl -X POST \"http://192.168.0.32:8080/api/v1/connect?token=YOUR_TOKEN\"\nThe Python script handles this automatically on first request\nConnection establishes a session that persists until the printer is powered off\nIf using raw curl commands, always call connect first\n\nConnection refused:\n\nVerify printer IP: ping 192.168.0.32\nCheck printer is powered on\nEnsure you're on the same network\n\nInvalid token:\n\nReconnect Luban to the printer (accept on touchscreen)\nCopy the new token from Luban's connection settings\nUpdate your config.json\n\nCan't send file:\n\nCheck if printer is busy: python3 scripts/snapmaker.py status\nWait for current print to finish\nUse --force only if absolutely necessary"
      },
      {
        "title": "References",
        "body": "Snapmaker Forum: Auto-start Guide\nSnapmaker Forum: API Documentation"
      },
      {
        "title": "Dependencies",
        "body": "Python 3.6+\nrequests library (install: pip3 install requests)"
      },
      {
        "title": "License",
        "body": "Part of OpenClaw skills collection."
      }
    ],
    "body": "Snapmaker 2.0 Skill\n\nControl and monitor Snapmaker 2.0 3D printers via their HTTP API.\n\nFeatures\nStatus monitoring - Real-time printer status (temperatures, progress, position)\nJob management - Send, start, pause, resume, and stop print jobs\nSafety features - Prevents interfering with active prints without confirmation\nProgress watching - Live monitoring of print progress\nNotification support - Detect print completion, filament issues, errors\nConfiguration\n\nCreate config.json in your workspace's snapmaker/ folder (e.g. ~/clawd/snapmaker/config.json). Start from config.json.example.\n\nConfig format:\n\n{\n  \"ip\": \"192.168.0.32\",\n  \"token\": \"your-token-here\",\n  \"port\": 8080\n}\n\n\nFinding your token: Open the Snapmaker Luban app, connect to your printer, and find the token in the connection settings. Copy it into your config.json.\n\nUsage\nDiscovery\n# Find Snapmaker printers on the local network (UDP broadcast, port 20054)\npython3 scripts/snapmaker.py discover\n\n# Probe a specific IP (useful across subnets)\npython3 scripts/snapmaker.py discover --target 192.168.0.32\n\n# JSON output\npython3 scripts/snapmaker.py discover --json\n\n\nDiscovery uses the Snapmaker UDP broadcast protocol (no auth required). Falls back to HTTP probe using config if UDP gets no reply (e.g. different subnet).\n\nBasic Commands\n# Get current printer status\npython3 scripts/snapmaker.py status\n\n# Watch print progress (updates every 5 seconds)\npython3 scripts/snapmaker.py watch\n\n# Get status as JSON\npython3 scripts/snapmaker.py status --json\n\nJob Control\n# Send a file (prepares but doesn't start)\npython3 scripts/snapmaker.py send ~/prints/model.gcode\n\n# Send and start immediately\npython3 scripts/snapmaker.py send ~/prints/model.gcode --start --yes\n\n# Pause current print\npython3 scripts/snapmaker.py pause --yes\n\n# Resume paused print\npython3 scripts/snapmaker.py resume --yes\n\n# Stop/cancel print (requires confirmation)\npython3 scripts/snapmaker.py stop\n\nSafety Flags\n--yes - Skip confirmation prompts (use with caution!)\n--force - Override safety checks (NOT RECOMMENDED)\n\nAll commands that modify state require confirmation unless --yes is provided.\n\nAPI Endpoints\n\nThe skill uses these Snapmaker HTTP API v1 endpoints:\n\nPOST /api/v1/connect - Establish connection\nGET /api/v1/status - Get printer status\nPOST /api/v1/prepare_print - Upload file\nPOST /api/v1/start_print - Start printing\nPOST /api/v1/pause - Pause print\nPOST /api/v1/resume - Resume print\nPOST /api/v1/stop - Stop/cancel print\nGET /api/v1/print_file - Download last file\nStatus Fields\n\nThe status command returns:\n\nstatus - Overall state (IDLE, RUNNING, PAUSED)\nprintStatus - Printing / Idle\nprogress - 0.0 to 1.0\nfileName - Current/last file\ncurrentLine / totalLines - G-code progress\nelapsedTime / remainingTime - In seconds\nnozzleTemperature1 / nozzleTargetTemperature1\nheatedBedTemperature / heatedBedTargetTemperature\nx / y / z - Current position\nisFilamentOut - Filament runout detection\nisEnclosureDoorOpen - Door state\nNotifications\n\nTo detect events:\n\n# Watch for completion\npython3 scripts/snapmaker.py watch\n\n# Or poll status in a loop\nwhile true; do\n  python3 scripts/snapmaker.py status --json | jq -r '.printStatus'\n  sleep 10\ndone\n\n\nEvent detection:\n\nPrint complete - status == \"IDLE\" && progress >= 0.99\nFilament out - isFilamentOut == true\nDoor opened - isEnclosureDoorOpen == true\nError - Check status field for errors\nSafety Features\nActive print protection - Cannot send files while printing\nConfirmation prompts - All destructive actions require confirmation\nState validation - Commands check printer state before executing\nClear warnings - Stop command shows prominent warning\nExamples\nCheck if printer is busy\npython3 scripts/snapmaker.py status | grep -q \"RUNNING\" && echo \"Busy\" || echo \"Available\"\n\nGet remaining time\npython3 scripts/snapmaker.py status --json | jq -r '.remainingTime'\n\nMonitor temperatures\npython3 scripts/snapmaker.py status --json | jq '{nozzle: .nozzleTemperature1, bed: .heatedBedTemperature}'\n\nTroubleshooting\n\n\"Machine is not connected yet\" (401 error):\n\nThe API requires calling /api/v1/connect first before any status queries\nExample: curl -X POST \"http://192.168.0.32:8080/api/v1/connect?token=YOUR_TOKEN\"\nThe Python script handles this automatically on first request\nConnection establishes a session that persists until the printer is powered off\nIf using raw curl commands, always call connect first\n\nConnection refused:\n\nVerify printer IP: ping 192.168.0.32\nCheck printer is powered on\nEnsure you're on the same network\n\nInvalid token:\n\nReconnect Luban to the printer (accept on touchscreen)\nCopy the new token from Luban's connection settings\nUpdate your config.json\n\nCan't send file:\n\nCheck if printer is busy: python3 scripts/snapmaker.py status\nWait for current print to finish\nUse --force only if absolutely necessary\nReferences\nSnapmaker Forum: Auto-start Guide\nSnapmaker Forum: API Documentation\nDependencies\nPython 3.6+\nrequests library (install: pip3 install requests)\nLicense\n\nPart of OpenClaw skills collection."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/odrobnik/snapmaker-2",
    "publisherUrl": "https://clawhub.ai/odrobnik/snapmaker-2",
    "owner": "odrobnik",
    "version": "1.2.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/snapmaker-2",
    "downloadUrl": "https://openagent3.xyz/downloads/snapmaker-2",
    "agentUrl": "https://openagent3.xyz/skills/snapmaker-2/agent",
    "manifestUrl": "https://openagent3.xyz/skills/snapmaker-2/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/snapmaker-2/agent.md"
  }
}