{
  "schemaVersion": "1.0",
  "item": {
    "slug": "lastfm-openclaw",
    "name": "Last.fm (OpenClaw)",
    "source": "tencent",
    "type": "skill",
    "category": "数据分析",
    "sourceUrl": "https://clawhub.ai/dennisooki/lastfm-openclaw",
    "canonicalUrl": "https://clawhub.ai/dennisooki/lastfm-openclaw",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/lastfm-openclaw",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=lastfm-openclaw",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "README.md",
      "SKILL.md",
      "references/api-endpoints.md",
      "references/auth-guide.md",
      "scripts/lastfm-api.sh"
    ],
    "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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.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/lastfm-openclaw"
    },
    "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/lastfm-openclaw",
    "agentPageUrl": "https://openagent3.xyz/skills/lastfm-openclaw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/lastfm-openclaw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/lastfm-openclaw/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. Then review README.md for any prerequisites, environment setup, or post-install checks. 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. Then review README.md for any prerequisites, environment setup, or post-install checks. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Last.fm Profile Skill",
        "body": "Retrieves Last.fm user listening data including now playing, top tracks/artists/albums by time period, and loved tracks. Optionally supports write operations (love/unlove tracks, scrobble) when LASTFM_SESSION_KEY is configured."
      },
      {
        "title": "Required Environment Variables",
        "body": "LASTFM_API_KEY: Your Last.fm API key (get one at https://www.last.fm/api/account/create)\nLASTFM_USERNAME: Your Last.fm username"
      },
      {
        "title": "Optional Environment Variables",
        "body": "LASTFM_SESSION_KEY: Required for write operations (love/unlove, scrobble)\nLASTFM_API_SECRET: Required to sign write operations (love/unlove, scrobble)"
      },
      {
        "title": "Workflow",
        "body": "Validate required environment variables are present\nEnsure dependencies (jq, curl) are available\nDetermine which command the user is requesting\nDetermine which command the user is requesting\nConstruct API request to ws.audioscrobbler.com/2.0/\nExecute HTTP GET request with appropriate method and parameters\nParse JSON response and format for user"
      },
      {
        "title": "Read Operations (No Auth Required)",
        "body": "CommandDescriptionExamplenow-playing, npCurrent or most recent track/lastfm nptop-tracks [period]Top tracks by period/lastfm top-tracks 7daytop-artists [period]Top artists by period/lastfm top-artists 1monthtop-albums [period]Top albums by period/lastfm top-albums overalllovedLoved tracks/lastfm lovedrecent [limit]Recent tracks (default 10)/lastfm recent 20profileUser profile info/lastfm profile"
      },
      {
        "title": "Time Periods",
        "body": "7day - Last 7 days\n1month - Last 30 days\n3month - Last 90 days\n6month - Last 180 days\n12month - Last year\noverall - All time (default if not specified)"
      },
      {
        "title": "Write Operations (Auth Required)",
        "body": "CommandDescriptionExamplelove <artist> <track>Love a track/lastfm love \"Radiohead\" \"Creep\"unlove <artist> <track>Unlove a track/lastfm unlove \"Radiohead\" \"Creep\""
      },
      {
        "title": "API Request Construction",
        "body": "Base URL: https://ws.audioscrobbler.com/2.0/\n\nRequired parameters for all requests:\n\napi_key: Value from LASTFM_API_KEY\nformat: json\nmethod: API method name\n\nUser-specific requests also require:\n\nuser: Value from LASTFM_USERNAME"
      },
      {
        "title": "Method Parameters",
        "body": "MethodAdditional Parametersuser.getInfouseruser.getRecentTracksuser, limit (optional)user.getTopTracksuser, period (optional)user.getTopArtistsuser, period (optional)user.getTopAlbumsuser, period (optional)user.getLovedTracksusertrack.loveartist, track, sk (session key)track.unloveartist, track, sk (session key)"
      },
      {
        "title": "Now Playing Response",
        "body": "Extract from recenttracks.track[0]:\n\nIf @attr.nowplaying === \"true\": currently playing\nartist.#text - Artist name\nname - Track name\nalbum.#text - Album name"
      },
      {
        "title": "Top Items Response",
        "body": "Extract array from:\n\ntoptracks.track[] for top tracks\ntopartists.artist[] for top artists\ntopalbums.album[] for top albums\n\nEach item includes:\n\nname - Item name\nplaycount - Play count\nartist.name - Artist (for tracks/albums)\n@attr.rank - Position in chart"
      },
      {
        "title": "Profile Response",
        "body": "Extract from user:\n\nname - Username\nrealname - Real name (if set)\nplaycount - Total scrobbles\ncountry - Country\nregistered - Account creation date\nurl - Profile URL"
      },
      {
        "title": "Guardrails",
        "body": "Never log or expose API keys or session keys in output\nRate limit: respect Last.fm's 5 requests/second limit\nWrite operations must fail gracefully if LASTFM_SESSION_KEY not set\nAll user inputs must be URL-encoded before API calls\nOnly connect to ws.audioscrobbler.com - no external endpoints\nHandle missing data gracefully (e.g., no now playing, empty loved tracks)\nValidate period parameter is one of: 7day, 1month, 3month, 6month, 12month, overall\nValidate recent limit is numeric and within 1–200"
      },
      {
        "title": "Error Handling",
        "body": "Error CodeMeaningAction10Invalid API keyTell user to check LASTFM_API_KEY6Invalid parametersCheck required params are present29Rate limit exceededWait and retry, inform user26Suspended API keyDirect user to Last.fm support4Authentication failedCheck session key for write ops"
      },
      {
        "title": "Now Playing",
        "body": "🎵 Now Playing:\n\"Track Name\" by Artist Name\nfrom Album Name\n\nOr if not currently playing:\n\n🎵 Last Played:\n\"Track Name\" by Artist Name\nListened: [timestamp]"
      },
      {
        "title": "Top Tracks",
        "body": "🎵 Top Tracks (7 days):\n\n1. \"Track One\" by Artist One (42 plays)\n2. \"Track Two\" by Artist Two (38 plays)\n3. \"Track Three\" by Artist Three (31 plays)\n..."
      },
      {
        "title": "Profile",
        "body": "🎵 Last.fm Profile: username\n\n📊 15,432 total scrobbles\n🌍 United Kingdom\n📅 Member since: Nov 2002\n🔗 last.fm/user/username"
      },
      {
        "title": "Setup Instructions",
        "body": "Get a Last.fm API key at https://www.last.fm/api/account/create\nAdd to ~/.openclaw/openclaw.json:\n\n{\n  skills: {\n    entries: {\n      lastfm: {\n        enabled: true,\n        env: {\n          LASTFM_API_KEY: \"your_api_key_here\",\n          LASTFM_USERNAME: \"your_username\"\n        }\n      }\n    }\n  }\n}\n\nFor write operations, see {baseDir}/references/auth-guide.md"
      }
    ],
    "body": "Last.fm Profile Skill\n\nRetrieves Last.fm user listening data including now playing, top tracks/artists/albums by time period, and loved tracks. Optionally supports write operations (love/unlove tracks, scrobble) when LASTFM_SESSION_KEY is configured.\n\nRequired Environment Variables\nLASTFM_API_KEY: Your Last.fm API key (get one at https://www.last.fm/api/account/create)\nLASTFM_USERNAME: Your Last.fm username\nOptional Environment Variables\nLASTFM_SESSION_KEY: Required for write operations (love/unlove, scrobble)\nLASTFM_API_SECRET: Required to sign write operations (love/unlove, scrobble)\nWorkflow\nValidate required environment variables are present\nEnsure dependencies (jq, curl) are available\nDetermine which command the user is requesting\nDetermine which command the user is requesting\nConstruct API request to ws.audioscrobbler.com/2.0/\nExecute HTTP GET request with appropriate method and parameters\nParse JSON response and format for user\nSupported Commands\nRead Operations (No Auth Required)\nCommand\tDescription\tExample\nnow-playing, np\tCurrent or most recent track\t/lastfm np\ntop-tracks [period]\tTop tracks by period\t/lastfm top-tracks 7day\ntop-artists [period]\tTop artists by period\t/lastfm top-artists 1month\ntop-albums [period]\tTop albums by period\t/lastfm top-albums overall\nloved\tLoved tracks\t/lastfm loved\nrecent [limit]\tRecent tracks (default 10)\t/lastfm recent 20\nprofile\tUser profile info\t/lastfm profile\nTime Periods\n7day - Last 7 days\n1month - Last 30 days\n3month - Last 90 days\n6month - Last 180 days\n12month - Last year\noverall - All time (default if not specified)\nWrite Operations (Auth Required)\nCommand\tDescription\tExample\nlove <artist> <track>\tLove a track\t/lastfm love \"Radiohead\" \"Creep\"\nunlove <artist> <track>\tUnlove a track\t/lastfm unlove \"Radiohead\" \"Creep\"\nAPI Request Construction\n\nBase URL: https://ws.audioscrobbler.com/2.0/\n\nRequired parameters for all requests:\n\napi_key: Value from LASTFM_API_KEY\nformat: json\nmethod: API method name\n\nUser-specific requests also require:\n\nuser: Value from LASTFM_USERNAME\nMethod Parameters\nMethod\tAdditional Parameters\nuser.getInfo\tuser\nuser.getRecentTracks\tuser, limit (optional)\nuser.getTopTracks\tuser, period (optional)\nuser.getTopArtists\tuser, period (optional)\nuser.getTopAlbums\tuser, period (optional)\nuser.getLovedTracks\tuser\ntrack.love\tartist, track, sk (session key)\ntrack.unlove\tartist, track, sk (session key)\nResponse Parsing\nNow Playing Response\n\nExtract from recenttracks.track[0]:\n\nIf @attr.nowplaying === \"true\": currently playing\nartist.#text - Artist name\nname - Track name\nalbum.#text - Album name\nTop Items Response\n\nExtract array from:\n\ntoptracks.track[] for top tracks\ntopartists.artist[] for top artists\ntopalbums.album[] for top albums\n\nEach item includes:\n\nname - Item name\nplaycount - Play count\nartist.name - Artist (for tracks/albums)\n@attr.rank - Position in chart\nProfile Response\n\nExtract from user:\n\nname - Username\nrealname - Real name (if set)\nplaycount - Total scrobbles\ncountry - Country\nregistered - Account creation date\nurl - Profile URL\nGuardrails\nNever log or expose API keys or session keys in output\nRate limit: respect Last.fm's 5 requests/second limit\nWrite operations must fail gracefully if LASTFM_SESSION_KEY not set\nAll user inputs must be URL-encoded before API calls\nOnly connect to ws.audioscrobbler.com - no external endpoints\nHandle missing data gracefully (e.g., no now playing, empty loved tracks)\nValidate period parameter is one of: 7day, 1month, 3month, 6month, 12month, overall\nValidate recent limit is numeric and within 1–200\nError Handling\nError Code\tMeaning\tAction\n10\tInvalid API key\tTell user to check LASTFM_API_KEY\n6\tInvalid parameters\tCheck required params are present\n29\tRate limit exceeded\tWait and retry, inform user\n26\tSuspended API key\tDirect user to Last.fm support\n4\tAuthentication failed\tCheck session key for write ops\nExample Output Formats\nNow Playing\n🎵 Now Playing:\n\"Track Name\" by Artist Name\nfrom Album Name\n\n\nOr if not currently playing:\n\n🎵 Last Played:\n\"Track Name\" by Artist Name\nListened: [timestamp]\n\nTop Tracks\n🎵 Top Tracks (7 days):\n\n1. \"Track One\" by Artist One (42 plays)\n2. \"Track Two\" by Artist Two (38 plays)\n3. \"Track Three\" by Artist Three (31 plays)\n...\n\nProfile\n🎵 Last.fm Profile: username\n\n📊 15,432 total scrobbles\n🌍 United Kingdom\n📅 Member since: Nov 2002\n🔗 last.fm/user/username\n\nSetup Instructions\nGet a Last.fm API key at https://www.last.fm/api/account/create\nAdd to ~/.openclaw/openclaw.json:\n{\n  skills: {\n    entries: {\n      lastfm: {\n        enabled: true,\n        env: {\n          LASTFM_API_KEY: \"your_api_key_here\",\n          LASTFM_USERNAME: \"your_username\"\n        }\n      }\n    }\n  }\n}\n\nFor write operations, see {baseDir}/references/auth-guide.md"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/dennisooki/lastfm-openclaw",
    "publisherUrl": "https://clawhub.ai/dennisooki/lastfm-openclaw",
    "owner": "dennisooki",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/lastfm-openclaw",
    "downloadUrl": "https://openagent3.xyz/downloads/lastfm-openclaw",
    "agentUrl": "https://openagent3.xyz/skills/lastfm-openclaw/agent",
    "manifestUrl": "https://openagent3.xyz/skills/lastfm-openclaw/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/lastfm-openclaw/agent.md"
  }
}