{
  "schemaVersion": "1.0",
  "item": {
    "slug": "notion-clipper-skill",
    "name": "notion-clipper-skill",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/EwingYangs/notion-clipper-skill",
    "canonicalUrl": "https://clawhub.ai/EwingYangs/notion-clipper-skill",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/notion-clipper-skill",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=notion-clipper-skill",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "_meta.json",
      "SKILL.md",
      "scripts/main.ts",
      "scripts/markdown-to-notion.ts",
      "scripts/notion-api.ts",
      "scripts/html-to-markdown.ts"
    ],
    "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-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-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/notion-clipper-skill"
    },
    "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/notion-clipper-skill",
    "agentPageUrl": "https://openagent3.xyz/skills/notion-clipper-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/notion-clipper-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/notion-clipper-skill/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": "Notion Clipper",
        "body": "Clip any web page to Notion. Uses Chrome CDP for full JavaScript rendering, converts to Markdown, then to Notion blocks."
      },
      {
        "title": "Prerequisites",
        "body": "Notion API Key: Create an integration at https://notion.so/my-integrations\nStore the key:\n\nmkdir -p ~/.config/notion\necho \"ntn_your_key_here\" > ~/.config/notion/api_key\n\nShare target database/page with your integration (click \"...\" → \"Connect to\" → your integration name)"
      },
      {
        "title": "First Time Setup",
        "body": "Dependencies are auto-installed when the script runs. No manual setup needed."
      },
      {
        "title": "Agent Execution Instructions",
        "body": "CRITICAL: Always use the command pattern below. It auto-installs dependencies on first run.\n\nDetermine this SKILL.md file's directory path as SKILL_DIR\nCommand pattern (package.json in scripts/; always run lazy install first):\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <args>)\n\nReplace ${SKILL_DIR} with the actual path (e.g. /Users/xxx/.claude/skills/notion-clipper-skill)"
      },
      {
        "title": "Usage",
        "body": "IMPORTANT - Use this command pattern for best results:\n\n# Recommended: Clear proxy env vars and use tsx runtime\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts <url> --database-name \"Resources\")\n\nWhy this pattern?\n\nunset http_proxy https_proxy all_proxy - Avoids ECONNREFUSED from proxy conflicts\ntsx runtime - Node.js runtime that properly handles direct connections (bun has proxy issues)\n(test -d node_modules || npm install) - Auto-installs dependencies if missing\n\nIf you encounter network issues:\n\nClose any VPN/proxy software\nSwitch to a stable network (mobile hotspot often works)\nUse the recommended command pattern above\n\n# Clip to a Notion database by NAME (recommended - searches for database)\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --database-name \"Resource\")\n\n# Clip to a Notion database by ID\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --database <database_id>)\n\n# Clip to an existing page (appends blocks)\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --page <page_id>)\n\n# List all accessible databases\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts --list-databases)\n\n# For pages requiring login (wait mode)\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --database-name \"Resource\" --wait)"
      },
      {
        "title": "Options",
        "body": "OptionDescription<url>URL to clip--database-name, -n <name>Target database by name (searches for match)--database, -d <id>Target Notion database by ID--page, -p <id>Target Notion page ID (appends blocks)--list-databases, -lList all accessible databases and exit--wait, -wWait for user signal before capturing--timeout, -t <ms>Page load timeout (default: 30000)--no-bookmarkDon't include bookmark block at top"
      },
      {
        "title": "Capture Modes",
        "body": "ModeBehaviorUse WhenAuto (default)Capture on network idlePublic pages, static contentWait (--wait)User signals when readyLogin-required, lazy loading, paywalls\n\nWait mode workflow:\n\nRun with --wait → Chrome opens, script outputs \"Press Enter when ready\"\nLog in or navigate as needed in the browser\nPress Enter in terminal to trigger capture"
      },
      {
        "title": "Output Structure",
        "body": "When saving to a database, creates a new page with:\n\nName: Page title\nURL: Source URL (if database has URL property)\nContent: Bookmark block + converted content blocks\n\nWhen appending to a page, adds:\n\nBookmark block (link to source)\nDivider\nConverted content blocks"
      },
      {
        "title": "Database Setup",
        "body": "For best results, create a Notion database with these properties:\n\nName (Title) - Required, will contain page title\nURL (URL) - Optional, will contain source URL"
      },
      {
        "title": "Examples",
        "body": "Clip a tweet to \"Resource\" database (by name):\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts \"https://x.com/dotey/status/123456\" -n \"Resource\")\n\nList all databases first:\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts --list-databases)\n\nClip article requiring login:\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts \"https://medium.com/article\" -n \"Reading\" --wait)\n\nAppend to reading notes page:\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts \"https://blog.example.com/post\" -p xyz789)\n\nQuick alias (add to your ~/.bashrc or ~/.zshrc):\n\nalias notion-clip='(cd \"${SKILL_DIR}/scripts\" && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts)'\n\n# Usage: notion-clip <url> -n \"Resources\""
      },
      {
        "title": "How It Works",
        "body": "Fetch: Launch Chrome via CDP, navigate to URL\nRender: Wait for JavaScript to execute, scroll to trigger lazy loading\nExtract: Run cleanup script to remove ads/nav, extract main content\nConvert: HTML → Markdown → Notion blocks\nSave: Call Notion API to create page or append blocks"
      },
      {
        "title": "Dependencies",
        "body": "Chrome/Chromium browser (installed locally)\nNode.js (script runs with tsx; Bun may route through proxy and return empty body, use Node)\nNotion API key configured\n\n(Other dependencies auto-install on first run.)"
      },
      {
        "title": "Environment Variables",
        "body": "VariableDescriptionNOTION_CLIPPER_CHROME_PATHCustom Chrome executable pathNOTION_CLIPPER_CHROME_PROFILE_DIRCustom Chrome profile directoryhttps_proxy / HTTP_PROXYProxy for Notion API (e.g. http://127.0.0.1:7890)http_proxy / HTTPS_PROXYSame as aboveall_proxyOptional, e.g. socks5://127.0.0.1:7890\n\nExample (proxy on port 7890):\n\nexport https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890"
      },
      {
        "title": "Network Issues",
        "body": "ErrorCauseSolutionECONNREFUSED 208.103.161.1:443DNS returns blocked IP; proxy conflict1. Close VPN/proxy software<br>2. Use unset http_proxy https_proxy all_proxy<br>3. Switch network (e.g., mobile hotspot)Notion API returned empty body (status 200)Using bun which routes through proxy incorrectlyRun with tsx: npx -y tsx main.ts ... (NOT bun)fetch failed or ECONNREFUSEDProxy env vars set but Node.js https doesn't support themEither:<br>1. Use network without proxy (unset env vars)<br>2. Ensure proxy allows HTTPS trafficCloudFlare 403Direct IP access triggers security protectionUse hostname instead of IP; ensure proper Authorization headerMixed: Sometimes works, sometimes failsUnstable network or DNS returns different IPsScript now has 6 retries with exponential backoff (1s, 2s, 4s, 4s...)\n\nBest Practice: For reliable Notion API access, use a stable network (mobile hotspot often works better than corporate VPN)."
      },
      {
        "title": "Content Issues",
        "body": "ErrorCauseSolutionInvalid URL for linkNotion API rejects non-http(s) URLsScript now removes all markdown links by default to avoid validation errors. Content is preserved, only links are stripped.\n\nNote: The script automatically removes these invalid URL types:\n\njavascript:, data:, file:, about: protocols\nWeChat internal links (weixin:, wx://)\nRelative paths (/path, ./path)\nHash-only links (#anchor)\nEmpty links"
      },
      {
        "title": "General Issues",
        "body": "Chrome not found: Set NOTION_CLIPPER_CHROME_PATH environment variable\nTimeout errors: Increase --timeout value or use --wait mode\nContent missing: Try --wait mode for dynamic/lazy-loaded pages\nNotion API error (401/403): Check API key validity and integration permissions\nNotion API error: Ensure integration has access to target database/page"
      },
      {
        "title": "Code Optimizations Applied",
        "body": "The following optimizations have been implemented to handle unstable networks and invalid URLs:\n\nAuto-retry mechanism: Up to 6 retries with exponential backoff (1s → 2s → 4s → 4s...)\nIncreased timeout: 30s for Notion API requests (was 25s)\nURL cleaning: Removes invalid URLs before Notion API submission\nUsing tsx: Node.js runtime that properly handles direct connections (unlike Bun)"
      }
    ],
    "body": "Notion Clipper\n\nClip any web page to Notion. Uses Chrome CDP for full JavaScript rendering, converts to Markdown, then to Notion blocks.\n\nPrerequisites\nNotion API Key: Create an integration at https://notion.so/my-integrations\nStore the key:\nmkdir -p ~/.config/notion\necho \"ntn_your_key_here\" > ~/.config/notion/api_key\n\nShare target database/page with your integration (click \"...\" → \"Connect to\" → your integration name)\nFirst Time Setup\n\nDependencies are auto-installed when the script runs. No manual setup needed.\n\nAgent Execution Instructions\n\nCRITICAL: Always use the command pattern below. It auto-installs dependencies on first run.\n\nDetermine this SKILL.md file's directory path as SKILL_DIR\nCommand pattern (package.json in scripts/; always run lazy install first):\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <args>)\n\nReplace ${SKILL_DIR} with the actual path (e.g. /Users/xxx/.claude/skills/notion-clipper-skill)\nUsage\n\nIMPORTANT - Use this command pattern for best results:\n\n# Recommended: Clear proxy env vars and use tsx runtime\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts <url> --database-name \"Resources\")\n\n\nWhy this pattern?\n\nunset http_proxy https_proxy all_proxy - Avoids ECONNREFUSED from proxy conflicts\ntsx runtime - Node.js runtime that properly handles direct connections (bun has proxy issues)\n(test -d node_modules || npm install) - Auto-installs dependencies if missing\n\nIf you encounter network issues:\n\nClose any VPN/proxy software\nSwitch to a stable network (mobile hotspot often works)\nUse the recommended command pattern above\n# Clip to a Notion database by NAME (recommended - searches for database)\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --database-name \"Resource\")\n\n# Clip to a Notion database by ID\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --database <database_id>)\n\n# Clip to an existing page (appends blocks)\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --page <page_id>)\n\n# List all accessible databases\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts --list-databases)\n\n# For pages requiring login (wait mode)\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && npx -y tsx main.ts <url> --database-name \"Resource\" --wait)\n\nOptions\nOption\tDescription\n<url>\tURL to clip\n--database-name, -n <name>\tTarget database by name (searches for match)\n--database, -d <id>\tTarget Notion database by ID\n--page, -p <id>\tTarget Notion page ID (appends blocks)\n--list-databases, -l\tList all accessible databases and exit\n--wait, -w\tWait for user signal before capturing\n--timeout, -t <ms>\tPage load timeout (default: 30000)\n--no-bookmark\tDon't include bookmark block at top\nCapture Modes\nMode\tBehavior\tUse When\nAuto (default)\tCapture on network idle\tPublic pages, static content\nWait (--wait)\tUser signals when ready\tLogin-required, lazy loading, paywalls\n\nWait mode workflow:\n\nRun with --wait → Chrome opens, script outputs \"Press Enter when ready\"\nLog in or navigate as needed in the browser\nPress Enter in terminal to trigger capture\nOutput Structure\n\nWhen saving to a database, creates a new page with:\n\nName: Page title\nURL: Source URL (if database has URL property)\nContent: Bookmark block + converted content blocks\n\nWhen appending to a page, adds:\n\nBookmark block (link to source)\nDivider\nConverted content blocks\nDatabase Setup\n\nFor best results, create a Notion database with these properties:\n\nName (Title) - Required, will contain page title\nURL (URL) - Optional, will contain source URL\nExamples\n\nClip a tweet to \"Resource\" database (by name):\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts \"https://x.com/dotey/status/123456\" -n \"Resource\")\n\n\nList all databases first:\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts --list-databases)\n\n\nClip article requiring login:\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts \"https://medium.com/article\" -n \"Reading\" --wait)\n\n\nAppend to reading notes page:\n\n(cd \"${SKILL_DIR}/scripts\" && (test -d node_modules || npm install) && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts \"https://blog.example.com/post\" -p xyz789)\n\n\nQuick alias (add to your ~/.bashrc or ~/.zshrc):\n\nalias notion-clip='(cd \"${SKILL_DIR}/scripts\" && unset http_proxy https_proxy all_proxy && npx -y tsx main.ts)'\n\n# Usage: notion-clip <url> -n \"Resources\"\n\nHow It Works\nFetch: Launch Chrome via CDP, navigate to URL\nRender: Wait for JavaScript to execute, scroll to trigger lazy loading\nExtract: Run cleanup script to remove ads/nav, extract main content\nConvert: HTML → Markdown → Notion blocks\nSave: Call Notion API to create page or append blocks\nDependencies\nChrome/Chromium browser (installed locally)\nNode.js (script runs with tsx; Bun may route through proxy and return empty body, use Node)\nNotion API key configured\n\n(Other dependencies auto-install on first run.)\n\nEnvironment Variables\nVariable\tDescription\nNOTION_CLIPPER_CHROME_PATH\tCustom Chrome executable path\nNOTION_CLIPPER_CHROME_PROFILE_DIR\tCustom Chrome profile directory\nhttps_proxy / HTTP_PROXY\tProxy for Notion API (e.g. http://127.0.0.1:7890)\nhttp_proxy / HTTPS_PROXY\tSame as above\nall_proxy\tOptional, e.g. socks5://127.0.0.1:7890\n\nExample (proxy on port 7890):\n\nexport https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890\n\nTroubleshooting\nNetwork Issues\nError\tCause\tSolution\nECONNREFUSED 208.103.161.1:443\tDNS returns blocked IP; proxy conflict\t1. Close VPN/proxy software<br>2. Use unset http_proxy https_proxy all_proxy<br>3. Switch network (e.g., mobile hotspot)\nNotion API returned empty body (status 200)\tUsing bun which routes through proxy incorrectly\tRun with tsx: npx -y tsx main.ts ... (NOT bun)\nfetch failed or ECONNREFUSED\tProxy env vars set but Node.js https doesn't support them\tEither:<br>1. Use network without proxy (unset env vars)<br>2. Ensure proxy allows HTTPS traffic\nCloudFlare 403\tDirect IP access triggers security protection\tUse hostname instead of IP; ensure proper Authorization header\nMixed: Sometimes works, sometimes fails\tUnstable network or DNS returns different IPs\tScript now has 6 retries with exponential backoff (1s, 2s, 4s, 4s...)\n\nBest Practice: For reliable Notion API access, use a stable network (mobile hotspot often works better than corporate VPN).\n\nContent Issues\nError\tCause\tSolution\nInvalid URL for link\tNotion API rejects non-http(s) URLs\tScript now removes all markdown links by default to avoid validation errors. Content is preserved, only links are stripped.\n\nNote: The script automatically removes these invalid URL types:\n\njavascript:, data:, file:, about: protocols\nWeChat internal links (weixin:, wx://)\nRelative paths (/path, ./path)\nHash-only links (#anchor)\nEmpty links\nGeneral Issues\nChrome not found: Set NOTION_CLIPPER_CHROME_PATH environment variable\nTimeout errors: Increase --timeout value or use --wait mode\nContent missing: Try --wait mode for dynamic/lazy-loaded pages\nNotion API error (401/403): Check API key validity and integration permissions\nNotion API error: Ensure integration has access to target database/page\nCode Optimizations Applied\n\nThe following optimizations have been implemented to handle unstable networks and invalid URLs:\n\nAuto-retry mechanism: Up to 6 retries with exponential backoff (1s → 2s → 4s → 4s...)\nIncreased timeout: 30s for Notion API requests (was 25s)\nURL cleaning: Removes invalid URLs before Notion API submission\nUsing tsx: Node.js runtime that properly handles direct connections (unlike Bun)"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/EwingYangs/notion-clipper-skill",
    "publisherUrl": "https://clawhub.ai/EwingYangs/notion-clipper-skill",
    "owner": "EwingYangs",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/notion-clipper-skill",
    "downloadUrl": "https://openagent3.xyz/downloads/notion-clipper-skill",
    "agentUrl": "https://openagent3.xyz/skills/notion-clipper-skill/agent",
    "manifestUrl": "https://openagent3.xyz/skills/notion-clipper-skill/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/notion-clipper-skill/agent.md"
  }
}