{
  "schemaVersion": "1.0",
  "item": {
    "slug": "sansfiction-library",
    "name": "Library",
    "source": "tencent",
    "type": "skill",
    "category": "内容创作",
    "sourceUrl": "https://clawhub.ai/fgbytes/sansfiction-library",
    "canonicalUrl": "https://clawhub.ai/fgbytes/sansfiction-library",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/sansfiction-library",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=sansfiction-library",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "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-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/sansfiction-library"
    },
    "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/sansfiction-library",
    "agentPageUrl": "https://openagent3.xyz/skills/sansfiction-library/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sansfiction-library/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sansfiction-library/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": "What this skill does",
        "body": "Library management (auth required): add/remove books, set reading status, log progress, view “currently reading”, and reading stats.\nDaily check-in: schedule a reminder that asks “How much did you read today?” and then logs what the user reports."
      },
      {
        "title": "Hard rules",
        "body": "Never ask for or store passwords. Use a SansFiction token only.\nNever echo the token back to the user or write it into chat logs.\nNo side effects without confirmation when the target book is ambiguous (multiple matches)."
      },
      {
        "title": "Setup (one-time) — get the token",
        "body": "If SANSFICTION_TOKEN is missing, do this immediately:\n\nTell the user to open SansFiction → Connect AI Agents and use Manual Token:\n\nGo to: https://sansfiction.com/docs/agents\nIn Manual Token, click Generate token\nCopy the token\n\n\n\nAsk the user to paste the token once in this chat.\n\n\nPersist it (recommended):\n\nIn ~/.openclaw/openclaw.json:\n\nskills.entries.sansfiction-library.apiKey: \"<TOKEN>\"\n(this maps to env var SANSFICTION_TOKEN)\n\n\nOr set:\n\nskills.entries.sansfiction-library.env.SANSFICTION_TOKEN: \"<TOKEN>\"\n\nIf you can’t edit config automatically, give the user the exact snippet to paste."
      },
      {
        "title": "How to talk to SansFiction (MCP over HTTP)",
        "body": "Endpoint:\n\nhttps://sansfiction.com/api/mcp\n\nUse JSON-RPC with Bearer auth."
      },
      {
        "title": "1) List available tools (discover exact tool names)",
        "body": "curl -s https://sansfiction.com/api/mcp \\\n  -H \"Authorization: Bearer $SANSFICTION_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}'\n\n2) Call a tool\n\nReplace TOOL_NAME and ARGS with what tools/list returns.\n\ncurl -s https://sansfiction.com/api/mcp \\\n  -H \"Authorization: Bearer $SANSFICTION_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"TOOL_NAME\",\"arguments\":ARGS}}'\n\nError handling\n\t•\tIf you get 401 Unauthorized, auth is missing/invalid. Ask user to regenerate token and update config.\n\t•\tIf tools/list is empty, verify the URL is exactly /api/mcp and auth header is present.\n\n⸻\n\nLibrary management playbook (what to do for each request)\n\nA) Add a book to the user’s library\n\nWhen user says: “add X” / “put X in my library”\n\t1.\tUse MCP search tools (discover name via tools/list). Prefer search by:\n\t•\tISBN (best) → exact match\n\t•\tTitle + author\n\t2.\tIf multiple plausible matches:\n\t•\tShow up to 5 options with distinguishing details (author, year, edition, pages/publisher if available).\n\t•\tAsk the user to pick one.\n\t3.\tCall the “add to library” tool.\n\t4.\tConfirm:\n\t•\tBook added\n\t•\tCurrent status (ask if they want “to-read” vs “reading”)\n\nB) Set reading status\n\nWhen user says: “mark as reading/finished/paused/abandoned”\n\t1.\tResolve the book (same matching rules as above).\n\t2.\tCall the “set status” tool with the exact status enum required by SansFiction.\n\t•\tIf the server rejects your status string, use the allowed values from the error/tool schema and retry.\n\t3.\tConfirm the new status.\n\nC) Log progress\n\nWhen user says: “I read 20 pages” / “I’m at page 150” / “read 30 minutes”\n\t1.\tAsk which book if not explicitly stated AND they have more than one active book.\n\t2.\tCall the “log progress” / “update progress” tool.\n\t•\tPrefer page number if provided.\n\t•\tOtherwise log pages read or minutes read, whichever the tool supports.\n\t3.\tConfirm what was recorded (book + new page/progress + date).\n\nD) List currently reading\n\nWhen user says: “what am I reading?” / “list currently reading”\n\t1.\tCall the “list library” tool filtered to “currently reading”.\n\t2.\tReturn:\n\t•\tTitle + author\n\t•\tCurrent progress (page/% if available)\n\nE) Stats\n\nWhen user asks: “monthly stats”, “how many books this year”\n\t1.\tCall the “stats” tool(s).\n\t2.\tSummarize clearly (books finished, pages/minutes, streak if available).\n\n⸻\n\nDaily reading reminder (cron)\n\nGoal: once per day, ask:\n\n“How much did you read today? Reply with: book (optional), pages or minutes, and current page if you know it.”\n\nTurn it on\n\nIf the user asks for the reminder (or says “enable daily check-in”):\n\t1.\tSchedule a cron job (timezone: Europe/Warsaw) at a reasonable default (21:00 local), unless the user specifies a time.\n\nCLI example:\n\nopenclaw cron add \\\n  --name \"SansFiction reading check-in\" \\\n  --cron \"0 21 * * *\" \\\n  --tz \"Europe/Warsaw\" \\\n  --session isolated \\\n  --message \"Reading check-in: how much did you read today? Reply with pages/minutes and (optionally) which book + your current page.\" \\\n  --deliver \\\n  --channel last\n\nWhat to do when the user replies\n\nTreat their reply as a progress log:\n\t•\tParse pages/minutes and optional book/current page.\n\t•\tIf book is missing/ambiguous, ask one quick follow-up.\n\t•\tThen log progress via MCP and confirm.\n\nTurn it off\n\nIf the user says “disable reading reminder”:\n\t•\tRemove the cron job named SansFiction reading check-in.\n\n⸻\n\nUser-facing examples (how users can invoke this skill)\n\t•\t“/sansfiction-library add Project Hail Mary”\n\t•\t“/sansfiction-library mark Dune finished”\n\t•\t“/sansfiction-library log Dune page 150”\n\t•\t“/sansfiction-library what am I currently reading?”\n\t•\t“/sansfiction-library enable daily reading reminder at 20:30”\n\nSources used: SansFiction MCP endpoint + token flow  [oai_citation:0‡SansFiction](https://sansfiction.com/docs/agents), \nOpenClaw skill frontmatter/metadata + config injection  [oai_citation:1‡OpenClaw](https://docs.openclaw.ai/tools/skills), \nOpenClaw cron scheduling (for the daily reminder)  [oai_citation:2‡OpenClaw](https://docs.openclaw.ai/automation/cron-jobs)."
      }
    ],
    "body": "SansFiction Library (Authorized)\nWhat this skill does\nLibrary management (auth required): add/remove books, set reading status, log progress, view “currently reading”, and reading stats.\nDaily check-in: schedule a reminder that asks “How much did you read today?” and then logs what the user reports.\nHard rules\nNever ask for or store passwords. Use a SansFiction token only.\nNever echo the token back to the user or write it into chat logs.\nNo side effects without confirmation when the target book is ambiguous (multiple matches).\nSetup (one-time) — get the token\n\nIf SANSFICTION_TOKEN is missing, do this immediately:\n\nTell the user to open SansFiction → Connect AI Agents and use Manual Token:\n\nGo to: https://sansfiction.com/docs/agents\nIn Manual Token, click Generate token\nCopy the token\n\nAsk the user to paste the token once in this chat.\n\nPersist it (recommended):\n\nIn ~/.openclaw/openclaw.json:\nskills.entries.sansfiction-library.apiKey: \"<TOKEN>\"\n(this maps to env var SANSFICTION_TOKEN)\nOr set:\nskills.entries.sansfiction-library.env.SANSFICTION_TOKEN: \"<TOKEN>\"\n\nIf you can’t edit config automatically, give the user the exact snippet to paste.\n\nHow to talk to SansFiction (MCP over HTTP)\n\nEndpoint:\n\nhttps://sansfiction.com/api/mcp\n\nUse JSON-RPC with Bearer auth.\n\n1) List available tools (discover exact tool names)\ncurl -s https://sansfiction.com/api/mcp \\\n  -H \"Authorization: Bearer $SANSFICTION_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\",\"params\":{}}'\n\n2) Call a tool\n\nReplace TOOL_NAME and ARGS with what tools/list returns.\n\ncurl -s https://sansfiction.com/api/mcp \\\n  -H \"Authorization: Bearer $SANSFICTION_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/call\",\"params\":{\"name\":\"TOOL_NAME\",\"arguments\":ARGS}}'\n\nError handling\n\t•\tIf you get 401 Unauthorized, auth is missing/invalid. Ask user to regenerate token and update config.\n\t•\tIf tools/list is empty, verify the URL is exactly /api/mcp and auth header is present.\n\n⸻\n\nLibrary management playbook (what to do for each request)\n\nA) Add a book to the user’s library\n\nWhen user says: “add X” / “put X in my library”\n\t1.\tUse MCP search tools (discover name via tools/list). Prefer search by:\n\t•\tISBN (best) → exact match\n\t•\tTitle + author\n\t2.\tIf multiple plausible matches:\n\t•\tShow up to 5 options with distinguishing details (author, year, edition, pages/publisher if available).\n\t•\tAsk the user to pick one.\n\t3.\tCall the “add to library” tool.\n\t4.\tConfirm:\n\t•\tBook added\n\t•\tCurrent status (ask if they want “to-read” vs “reading”)\n\nB) Set reading status\n\nWhen user says: “mark as reading/finished/paused/abandoned”\n\t1.\tResolve the book (same matching rules as above).\n\t2.\tCall the “set status” tool with the exact status enum required by SansFiction.\n\t•\tIf the server rejects your status string, use the allowed values from the error/tool schema and retry.\n\t3.\tConfirm the new status.\n\nC) Log progress\n\nWhen user says: “I read 20 pages” / “I’m at page 150” / “read 30 minutes”\n\t1.\tAsk which book if not explicitly stated AND they have more than one active book.\n\t2.\tCall the “log progress” / “update progress” tool.\n\t•\tPrefer page number if provided.\n\t•\tOtherwise log pages read or minutes read, whichever the tool supports.\n\t3.\tConfirm what was recorded (book + new page/progress + date).\n\nD) List currently reading\n\nWhen user says: “what am I reading?” / “list currently reading”\n\t1.\tCall the “list library” tool filtered to “currently reading”.\n\t2.\tReturn:\n\t•\tTitle + author\n\t•\tCurrent progress (page/% if available)\n\nE) Stats\n\nWhen user asks: “monthly stats”, “how many books this year”\n\t1.\tCall the “stats” tool(s).\n\t2.\tSummarize clearly (books finished, pages/minutes, streak if available).\n\n⸻\n\nDaily reading reminder (cron)\n\nGoal: once per day, ask:\n\n“How much did you read today? Reply with: book (optional), pages or minutes, and current page if you know it.”\n\nTurn it on\n\nIf the user asks for the reminder (or says “enable daily check-in”):\n\t1.\tSchedule a cron job (timezone: Europe/Warsaw) at a reasonable default (21:00 local), unless the user specifies a time.\n\nCLI example:\n\nopenclaw cron add \\\n  --name \"SansFiction reading check-in\" \\\n  --cron \"0 21 * * *\" \\\n  --tz \"Europe/Warsaw\" \\\n  --session isolated \\\n  --message \"Reading check-in: how much did you read today? Reply with pages/minutes and (optionally) which book + your current page.\" \\\n  --deliver \\\n  --channel last\n\nWhat to do when the user replies\n\nTreat their reply as a progress log:\n\t•\tParse pages/minutes and optional book/current page.\n\t•\tIf book is missing/ambiguous, ask one quick follow-up.\n\t•\tThen log progress via MCP and confirm.\n\nTurn it off\n\nIf the user says “disable reading reminder”:\n\t•\tRemove the cron job named SansFiction reading check-in.\n\n⸻\n\nUser-facing examples (how users can invoke this skill)\n\t•\t“/sansfiction-library add Project Hail Mary”\n\t•\t“/sansfiction-library mark Dune finished”\n\t•\t“/sansfiction-library log Dune page 150”\n\t•\t“/sansfiction-library what am I currently reading?”\n\t•\t“/sansfiction-library enable daily reading reminder at 20:30”\n\nSources used: SansFiction MCP endpoint + token flow  [oai_citation:0‡SansFiction](https://sansfiction.com/docs/agents), \nOpenClaw skill frontmatter/metadata + config injection  [oai_citation:1‡OpenClaw](https://docs.openclaw.ai/tools/skills), \nOpenClaw cron scheduling (for the daily reminder)  [oai_citation:2‡OpenClaw](https://docs.openclaw.ai/automation/cron-jobs)."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/fgbytes/sansfiction-library",
    "publisherUrl": "https://clawhub.ai/fgbytes/sansfiction-library",
    "owner": "fgbytes",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/sansfiction-library",
    "downloadUrl": "https://openagent3.xyz/downloads/sansfiction-library",
    "agentUrl": "https://openagent3.xyz/skills/sansfiction-library/agent",
    "manifestUrl": "https://openagent3.xyz/skills/sansfiction-library/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/sansfiction-library/agent.md"
  }
}