{
  "schemaVersion": "1.0",
  "item": {
    "slug": "vibe-notion",
    "name": "Vibe Notion",
    "source": "tencent",
    "type": "skill",
    "category": "效率提升",
    "sourceUrl": "https://clawhub.ai/devxoul/vibe-notion",
    "canonicalUrl": "https://clawhub.ai/devxoul/vibe-notion",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/vibe-notion",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=vibe-notion",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "references/batch-operations.md",
      "references/block-types.md",
      "references/common-patterns.md",
      "references/output-format.md",
      "templates/create-page.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. 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/vibe-notion"
    },
    "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/vibe-notion",
    "agentPageUrl": "https://openagent3.xyz/skills/vibe-notion/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vibe-notion/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vibe-notion/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": "Vibe Notion",
        "body": "A TypeScript CLI tool that enables AI agents and humans to interact with Notion workspaces through the unofficial private API. Supports full CRUD operations on pages, databases, blocks, search, and user management.\n\nNote: This skill uses Notion's internal/private API (/api/v3/), which is separate from the official public API. For official API access, use vibe-notionbot."
      },
      {
        "title": "Which CLI to Use",
        "body": "This package ships two CLIs. Pick the right one based on your situation:\n\nvibe-notion (this CLI)vibe-notionbotAPIUnofficial private APIOfficial Notion APIAuthtoken_v2 auto-extracted from Notion desktop appNOTION_TOKEN env var (Integration token)IdentityActs as the userActs as a botSetupZero — credentials extracted automaticallyManual — create Integration at notion.so/my-integrationsDatabase rowsadd-row, update-rowCreate via page create --databaseView managementview-get, view-update, view-list, view-add, view-deleteNot supportedWorkspace listingSupportedNot supportedStabilityPrivate API — may break on Notion changesOfficial versioned API — stable\n\nDecision flow:\n\nIf the Notion desktop app is installed → use vibe-notion (this CLI)\nIf NOTION_TOKEN is set but no desktop app → use vibe-notionbot\nIf both are available → prefer vibe-notion (broader capabilities, zero setup)\nIf neither → ask the user to set up one of the two"
      },
      {
        "title": "Important: CLI Only",
        "body": "Never call Notion's internal API directly. Always use the vibe-notion CLI commands described in this skill. Do not make raw HTTP requests to notion.so/api/v3/ or use any Notion client library. Direct API calls risk exposing credentials and may trigger Notion's abuse detection, getting the user's account blocked.\n\nIf a feature you need is not supported by vibe-notion, let the user know and offer to file a feature request at devxoul/vibe-notion on their behalf. Before submitting, strip out any real user data — IDs, names, emails, tokens, page content, or anything else that could identify the user or their workspace. Use generic placeholders instead and keep the issue focused on describing the missing capability."
      },
      {
        "title": "Important: Never Write Scripts",
        "body": "Never write scripts (Python, TypeScript, Bash, etc.) to automate Notion operations. The batch command already handles bulk operations of any size. Writing a script to loop through API calls is always wrong — use batch with --file instead.\n\nThis applies even when:\n\nYou need to create 100+ rows\nYou need cross-references between newly created rows (use multi-pass batch — see references/batch-operations.md)\nThe operation feels \"too big\" for a single command\n\nIf you catch yourself thinking \"I should write a script for this,\" stop and use batch."
      },
      {
        "title": "Quick Start",
        "body": "# 1. Find your workspace ID\nvibe-notion workspace list --pretty\n\n# 2. Search for a page\nvibe-notion search \"Roadmap\" --workspace-id <workspace-id> --pretty\n\n# 3. Get page content\nvibe-notion page get <page-id> --workspace-id <workspace-id> --pretty\n\n# 4. Query a database\nvibe-notion database query <collection-id> --workspace-id <workspace-id> --pretty\n\nCredentials are auto-extracted from the Notion desktop app on first use. No manual setup needed.\n\nImportant: --workspace-id is required for ALL commands that operate within a specific workspace. Use vibe-notion workspace list to find your workspace ID."
      },
      {
        "title": "Authentication",
        "body": "Credentials (token_v2) are auto-extracted from the Notion desktop app when you run any command. No API keys, OAuth, or manual extraction needed.\n\nOn macOS, your system may prompt for Keychain access on first use — this is normal and required to decrypt the cookie.\n\nThe extracted token_v2 is stored at ~/.config/vibe-notion/credentials.json with 0600 permissions."
      },
      {
        "title": "Memory",
        "body": "The agent maintains a ~/.config/vibe-notion/MEMORY.md file as persistent memory across sessions. This is agent-managed — the CLI does not read or write this file. Use the Read and Write tools to manage your memory file."
      },
      {
        "title": "Reading Memory",
        "body": "At the start of every task, read ~/.config/vibe-notion/MEMORY.md using the Read tool to load any previously discovered workspace IDs, page IDs, database IDs, and user preferences.\n\nIf the file doesn't exist yet, that's fine — proceed without it and create it when you first have useful information to store.\nIf the file can't be read (permissions, missing directory), proceed without memory — don't error out."
      },
      {
        "title": "Writing Memory",
        "body": "After discovering useful information, update ~/.config/vibe-notion/MEMORY.md using the Write tool. Write triggers include:\n\nAfter discovering workspace IDs (from workspace list)\nAfter discovering useful page IDs, database IDs, collection IDs (from search, page list, page get, database list, etc.)\nAfter the user gives you an alias or preference (\"call this the Tasks DB\", \"my main workspace is X\")\nAfter discovering page/database structure (parent-child relationships, what databases live under which pages)\n\nWhen writing, include the complete file content — the Write tool overwrites the entire file."
      },
      {
        "title": "What to Store",
        "body": "Workspace IDs with names\nPage IDs with titles and parent context\nDatabase/collection IDs with titles and parent context\nUser-given aliases (\"Tasks DB\", \"Main workspace\")\nCommonly used view IDs\nParent-child relationships (which databases are under which pages)\nAny user preference expressed during interaction"
      },
      {
        "title": "What NOT to Store",
        "body": "Never store token_v2, credentials, API keys, or any sensitive data. Never store full page content (just IDs and titles). Never store block-level IDs unless they're persistent references (like database blocks)."
      },
      {
        "title": "Handling Stale Data",
        "body": "If a memorized ID returns an error (page not found, access denied), remove it from MEMORY.md. Don't blindly trust memorized data — verify when something seems off. Prefer re-searching over using a memorized ID that might be stale."
      },
      {
        "title": "Format / Example",
        "body": "Here's a concrete example of how to structure your MEMORY.md:\n\n# Vibe Notion Memory\n\n## Workspaces\n\n- `abc123-...` — Acme Corp (default)\n\n## Pages (Acme Corp)\n\n- `page-id-1` — Product Roadmap (top-level)\n- `page-id-2` — Q1 Planning (under Product Roadmap)\n\n## Databases (Acme Corp)\n\n- `coll-id-1` — Tasks (under Product Roadmap, views: `view-1`)\n- `coll-id-2` — Contacts (top-level)\n\n## Aliases\n\n- \"roadmap\" → `page-id-1` (Product Roadmap)\n- \"tasks\" → `coll-id-1` (Tasks database)\n\n## Notes\n\n- User prefers --pretty output for search results\n- Main workspace is \"Acme Corp\"\n\nMemory lets you skip repeated search and workspace list calls. When you already know an ID from a previous session, use it directly."
      },
      {
        "title": "Auth Commands",
        "body": "vibe-notion auth status     # Check authentication status\nvibe-notion auth logout     # Remove stored token_v2\nvibe-notion auth extract    # Manually re-extract token_v2 (for troubleshooting)"
      },
      {
        "title": "Page Commands",
        "body": "# List pages in a space (top-level only)\nvibe-notion page list --workspace-id <workspace_id> --pretty\nvibe-notion page list --workspace-id <workspace_id> --depth 2 --pretty\n\n# Get a page and all its content blocks\nvibe-notion page get <page_id> --workspace-id <workspace_id> --pretty\nvibe-notion page get <page_id> --workspace-id <workspace_id> --limit 50\nvibe-notion page get <page_id> --workspace-id <workspace_id> --backlinks --pretty\n\n# Create a new page (--parent is optional; omit to create at workspace root)\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Page\" --pretty\nvibe-notion page create --workspace-id <workspace_id> --title \"New Root Page\" --pretty\n\n\n# Create a page with markdown content\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Doc\" --markdown '# Hello\\n\\nThis is **bold** text.'\n\n# Create a page with markdown from a file\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Doc\" --markdown-file ./content.md\n\n# Create a page with markdown containing local images (auto-uploaded to Notion)\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Doc\" --markdown-file ./doc-with-images.md\n\n# Replace all content on a page with new markdown\nvibe-notion page update <page_id> --workspace-id <workspace_id> --replace-content --markdown '# New Content'\nvibe-notion page update <page_id> --workspace-id <workspace_id> --replace-content --markdown-file ./updated.md\n\n# Update page title or icon\nvibe-notion page update <page_id> --workspace-id <workspace_id> --title \"New Title\" --pretty\nvibe-notion page update <page_id> --workspace-id <workspace_id> --icon \"🚀\" --pretty\n\n# Archive a page\nvibe-notion page archive <page_id> --workspace-id <workspace_id> --pretty\n\n# Get page or database row properties (without content blocks — lightweight alternative to page get)\nvibe-notion page properties <page_id> --workspace-id <workspace_id> --pretty"
      },
      {
        "title": "Database Commands",
        "body": "# Get database schema\nvibe-notion database get <database_id> --workspace-id <workspace_id> --pretty\n\n# Query a database (auto-resolves default view)\nvibe-notion database query <database_id> --workspace-id <workspace_id> --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --limit 10 --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --view-id <view_id> --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --search-query \"keyword\" --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --timezone \"America/New_York\" --pretty\n\n# Query with filter and sort (uses property IDs from database get schema)\nvibe-notion database query <database_id> --workspace-id <workspace_id> --filter '<filter_json>' --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --sort '<sort_json>' --pretty\n\n# List all databases in workspace\nvibe-notion database list --workspace-id <workspace_id> --pretty\n\n# Create a database\nvibe-notion database create --workspace-id <workspace_id> --parent <page_id> --title \"Tasks\" --pretty\nvibe-notion database create --workspace-id <workspace_id> --parent <page_id> --title \"Tasks\" --properties '{\"status\":{\"name\":\"Status\",\"type\":\"select\"}}' --pretty\n\n# Update database title or schema\nvibe-notion database update <database_id> --workspace-id <workspace_id> --title \"New Name\" --pretty\nvibe-notion database update <database_id> --workspace-id <workspace_id> --properties '{\"status\":{\"name\":\"Status\",\"type\":\"select\"}}' --pretty\nvibe-notion database update <database_id> --workspace-id <workspace_id> --title \"New Name\" --properties '{\"status\":{\"name\":\"Status\",\"type\":\"select\"}}' --pretty\n\n# Add a row to a database\nvibe-notion database add-row <database_id> --workspace-id <workspace_id> --title \"Row title\" --pretty\nvibe-notion database add-row <database_id> --workspace-id <workspace_id> --title \"Row title\" --properties '{\"Status\":\"In Progress\",\"Due\":{\"start\":\"2025-03-01\"}}' --pretty\n\n# Add row with date range\nvibe-notion database add-row <database_id> --workspace-id <workspace_id> --title \"Event\" --properties '{\"Due\":{\"start\":\"2026-01-01\",\"end\":\"2026-01-15\"}}' --pretty\n\n# Update properties on an existing database row (row_id from database query)\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Status\":\"Done\"}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Priority\":\"High\",\"Tags\":[\"backend\",\"infra\"]}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Due\":{\"start\":\"2026-06-01\"},\"Status\":\"In Progress\"}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Due\":{\"start\":\"2026-01-01\",\"end\":\"2026-01-15\"}}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Related\":[\"<target_row_id>\"]}' --pretty\n\n# Delete a property from a database (cannot delete the title property)\nvibe-notion database delete-property <database_id> --workspace-id <workspace_id> --property \"Status\" --pretty\n\n# Get view configuration and property visibility\nvibe-notion database view-get <view_id> --workspace-id <workspace_id> --pretty\n\n# Show or hide properties on a view (comma-separated names)\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --show \"ID,Due\" --pretty\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --hide \"Assignee\" --pretty\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --show \"Status\" --hide \"Due\" --pretty\n\n# Reorder columns (comma-separated names in desired order; unmentioned columns appended)\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --reorder \"Name,Status,Priority,Date\" --pretty\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --reorder \"Name,Status\" --show \"Status\" --pretty\n\n# Resize columns (JSON mapping property names to pixel widths)\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --resize '{\"Name\":200,\"Status\":150}' --pretty\n\n# List all views for a database\nvibe-notion database view-list <database_id> --workspace-id <workspace_id> --pretty\n\n# Add a new view to a database (default type: table)\nvibe-notion database view-add <database_id> --workspace-id <workspace_id> --pretty\nvibe-notion database view-add <database_id> --workspace-id <workspace_id> --type board --name \"Board View\" --pretty\n\n# Delete a view from a database (cannot delete the last view)\nvibe-notion database view-delete <view_id> --workspace-id <workspace_id> --pretty"
      },
      {
        "title": "Block Commands",
        "body": "# Get a specific block\nvibe-notion block get <block_id> --workspace-id <workspace_id> --pretty\nvibe-notion block get <block_id> --workspace-id <workspace_id> --backlinks --pretty\n\n# List child blocks\nvibe-notion block children <block_id> --workspace-id <workspace_id> --pretty\nvibe-notion block children <block_id> --workspace-id <workspace_id> --limit 50 --pretty\nvibe-notion block children <block_id> --workspace-id <workspace_id> --start-cursor '<next_cursor_json>' --pretty\n\n# Append child blocks\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --content '[{\"type\":\"text\",\"properties\":{\"title\":[[\"Hello world\"]]}}]' --pretty\n\n# Append markdown content as blocks\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown '# Hello\\n\\nThis is **bold** text.'\n\n# Append markdown from a file\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown-file ./content.md\n\n# Append markdown with local images (auto-uploaded to Notion)\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown-file ./doc-with-images.md\n\n# Append nested markdown (indented lists become nested children blocks)\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown '- Parent item\\n  - Child item\\n    - Grandchild item'\n\n# Append blocks after a specific block (positional insertion)\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --after <block_id> --markdown '# Inserted after specific block'\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --after <block_id> --content '[{\"type\":\"text\",\"properties\":{\"title\":[[\"Inserted after\"]]}}]'\n\n# Append blocks before a specific block\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --before <block_id> --markdown '# Inserted before specific block'\n\n# Update a block\nvibe-notion block update <block_id> --workspace-id <workspace_id> --content '{\"properties\":{\"title\":[[\"Updated text\"]]}}' --pretty\n\n# Delete a block\nvibe-notion block delete <block_id> --workspace-id <workspace_id> --pretty\n\n# Upload a file as a block (image or file block)\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./image.png --pretty\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./document.pdf --pretty\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./image.png --after <block_id> --pretty\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./image.png --before <block_id> --pretty\n\n# Move a block to a new position\nvibe-notion block move <block_id> --workspace-id <workspace_id> --parent <parent_id> --pretty\nvibe-notion block move <block_id> --workspace-id <workspace_id> --parent <parent_id> --after <sibling_id> --pretty\nvibe-notion block move <block_id> --workspace-id <workspace_id> --parent <parent_id> --before <sibling_id> --pretty"
      },
      {
        "title": "Block Types & Rich Text Reference",
        "body": "For block type JSON format (headings, text, lists, to-do, code, quote, divider) and rich text formatting codes, see references/block-types.md."
      },
      {
        "title": "Comment Commands",
        "body": "# List comments on a page\nvibe-notion comment list --page <page_id> --workspace-id <workspace_id> --pretty\n\n# List inline comments on a specific block\nvibe-notion comment list --page <page_id> --block <block_id> --workspace-id <workspace_id> --pretty\n\n# Create a comment on a page (starts a new discussion)\nvibe-notion comment create \"This is a comment\" --page <page_id> --workspace-id <workspace_id> --pretty\n\n# Reply to an existing discussion thread\nvibe-notion comment create \"Replying to thread\" --discussion <discussion_id> --workspace-id <workspace_id> --pretty\n\n# Get a specific comment by ID\nvibe-notion comment get <comment_id> --workspace-id <workspace_id> --pretty"
      },
      {
        "title": "Batch Operations",
        "body": "For batch command format, supported actions (14 total), operation JSON structure, output format, fail-fast behavior, bulk operations strategy (multi-pass pattern), and rate limit handling, see references/batch-operations.md.\n\nQuick usage:\n\n# Inline JSON\nvibe-notion batch --workspace-id <workspace_id> '<operations_json>'\n\n# From file (for large payloads)\nvibe-notion batch --workspace-id <workspace_id> --file ./operations.json '[]'"
      },
      {
        "title": "Search Command",
        "body": "# Search across workspace (--workspace-id is required)\nvibe-notion search \"query\" --workspace-id <workspace_id> --pretty\nvibe-notion search \"query\" --workspace-id <workspace_id> --limit 10 --pretty\nvibe-notion search \"query\" --workspace-id <workspace_id> --start-cursor <offset> --pretty\nvibe-notion search \"query\" --workspace-id <workspace_id> --sort lastEdited --pretty"
      },
      {
        "title": "User Commands",
        "body": "# Get current user info\nvibe-notion user me --pretty\n\n# Get a specific user\nvibe-notion user get <user_id> --workspace-id <workspace_id> --pretty\n\n# List users in a workspace\nvibe-notion user list --workspace-id <workspace_id> --pretty"
      },
      {
        "title": "Output Format",
        "body": "All commands output JSON by default. Use --pretty for human-readable output.\n\nFor JSON response shapes (search, database query, page get, block get, backlinks), $hints schema warnings, and detailed examples, see references/output-format.md."
      },
      {
        "title": "When to Use --backlinks",
        "body": "Backlinks reveal which pages/databases link to a given page. This is critical for efficient navigation.\n\nUse --backlinks when:\n\nTracing relations: A search result looks like a select option, enum value, or relation target (e.g., a plan name or category). Backlinks instantly reveal all rows/pages that reference it via relation properties — no need to hunt for the parent database.\nFinding references: You found a page and want to know what other pages mention or link to it.\nReverse lookups: Instead of querying every database to find rows pointing to a page, use backlinks on the target page to get them directly.\n\nExample — finding who uses a specific plan:\n\n# BAD: 15 API calls — search, open empty pages, trace parents, find database, query\nvibe-notion search \"Enterprise Plan\" ...\nvibe-notion page get <plan-page-id> ...  # empty\nvibe-notion block get <plan-page-id> ...  # find parent\n# ... many more calls to discover the database\n\n# GOOD: 2-3 API calls — search, then backlinks on the target\nvibe-notion search \"Enterprise Plan\" ...\nvibe-notion page get <plan-page-id> --backlinks --pretty\n# → backlinks immediately show all people/rows linked to this plan"
      },
      {
        "title": "Pagination",
        "body": "Commands that return lists support pagination via has_more, next_cursor fields:\n\nblock children: Cursor-based. Pass next_cursor value from previous response as --start-cursor.\nsearch: Offset-based. Pass next_cursor value (a number) as --start-cursor.\ndatabase query: Use --limit to control page size. has_more indicates more results exist, but the private API does not support cursor-based pagination — increase --limit to fetch more rows."
      },
      {
        "title": "Authentication failures",
        "body": "If auto-extraction fails (e.g., Notion desktop app is not installed or not logged in), run the extract command manually for debug output:\n\nvibe-notion auth extract --debug\n\nThis shows the Notion directory path and extraction steps to help diagnose the issue."
      },
      {
        "title": "Database locked during extraction",
        "body": "If auth extract fails with:\n\n{\"error\":\"No token_v2 found. Make sure Notion desktop app is installed and logged in.\"}\n\nAnd the Notion desktop app is installed and logged in, the cookie database may be locked by the running Notion app. Tell the user to quit the Notion desktop app completely, then retry the command. Once credentials are extracted, the user can reopen Notion."
      },
      {
        "title": "vibe-notion: command not found",
        "body": "The vibe-notion package is not installed. Run it directly using a package runner. Ask the user which one to use:\n\nnpx -y vibe-notion ...\nbunx vibe-notion ...\npnpm dlx vibe-notion ...\n\nIf you already know the user's preferred package runner, use it directly instead of asking."
      },
      {
        "title": "Limitations",
        "body": "Auto-extraction supports macOS and Linux. Windows DPAPI decryption is not yet supported.\ntoken_v2 uses the unofficial internal API and may break if Notion changes it.\nThis is a private/unofficial API and is not supported by Notion."
      }
    ],
    "body": "Vibe Notion\n\nA TypeScript CLI tool that enables AI agents and humans to interact with Notion workspaces through the unofficial private API. Supports full CRUD operations on pages, databases, blocks, search, and user management.\n\nNote: This skill uses Notion's internal/private API (/api/v3/), which is separate from the official public API. For official API access, use vibe-notionbot.\n\nWhich CLI to Use\n\nThis package ships two CLIs. Pick the right one based on your situation:\n\n\tvibe-notion (this CLI)\tvibe-notionbot\nAPI\tUnofficial private API\tOfficial Notion API\nAuth\ttoken_v2 auto-extracted from Notion desktop app\tNOTION_TOKEN env var (Integration token)\nIdentity\tActs as the user\tActs as a bot\nSetup\tZero — credentials extracted automatically\tManual — create Integration at notion.so/my-integrations\nDatabase rows\tadd-row, update-row\tCreate via page create --database\nView management\tview-get, view-update, view-list, view-add, view-delete\tNot supported\nWorkspace listing\tSupported\tNot supported\nStability\tPrivate API — may break on Notion changes\tOfficial versioned API — stable\n\nDecision flow:\n\nIf the Notion desktop app is installed → use vibe-notion (this CLI)\nIf NOTION_TOKEN is set but no desktop app → use vibe-notionbot\nIf both are available → prefer vibe-notion (broader capabilities, zero setup)\nIf neither → ask the user to set up one of the two\nImportant: CLI Only\n\nNever call Notion's internal API directly. Always use the vibe-notion CLI commands described in this skill. Do not make raw HTTP requests to notion.so/api/v3/ or use any Notion client library. Direct API calls risk exposing credentials and may trigger Notion's abuse detection, getting the user's account blocked.\n\nIf a feature you need is not supported by vibe-notion, let the user know and offer to file a feature request at devxoul/vibe-notion on their behalf. Before submitting, strip out any real user data — IDs, names, emails, tokens, page content, or anything else that could identify the user or their workspace. Use generic placeholders instead and keep the issue focused on describing the missing capability.\n\nImportant: Never Write Scripts\n\nNever write scripts (Python, TypeScript, Bash, etc.) to automate Notion operations. The batch command already handles bulk operations of any size. Writing a script to loop through API calls is always wrong — use batch with --file instead.\n\nThis applies even when:\n\nYou need to create 100+ rows\nYou need cross-references between newly created rows (use multi-pass batch — see references/batch-operations.md)\nThe operation feels \"too big\" for a single command\n\nIf you catch yourself thinking \"I should write a script for this,\" stop and use batch.\n\nQuick Start\n# 1. Find your workspace ID\nvibe-notion workspace list --pretty\n\n# 2. Search for a page\nvibe-notion search \"Roadmap\" --workspace-id <workspace-id> --pretty\n\n# 3. Get page content\nvibe-notion page get <page-id> --workspace-id <workspace-id> --pretty\n\n# 4. Query a database\nvibe-notion database query <collection-id> --workspace-id <workspace-id> --pretty\n\n\nCredentials are auto-extracted from the Notion desktop app on first use. No manual setup needed.\n\nImportant: --workspace-id is required for ALL commands that operate within a specific workspace. Use vibe-notion workspace list to find your workspace ID.\n\nAuthentication\n\nCredentials (token_v2) are auto-extracted from the Notion desktop app when you run any command. No API keys, OAuth, or manual extraction needed.\n\nOn macOS, your system may prompt for Keychain access on first use — this is normal and required to decrypt the cookie.\n\nThe extracted token_v2 is stored at ~/.config/vibe-notion/credentials.json with 0600 permissions.\n\nMemory\n\nThe agent maintains a ~/.config/vibe-notion/MEMORY.md file as persistent memory across sessions. This is agent-managed — the CLI does not read or write this file. Use the Read and Write tools to manage your memory file.\n\nReading Memory\n\nAt the start of every task, read ~/.config/vibe-notion/MEMORY.md using the Read tool to load any previously discovered workspace IDs, page IDs, database IDs, and user preferences.\n\nIf the file doesn't exist yet, that's fine — proceed without it and create it when you first have useful information to store.\nIf the file can't be read (permissions, missing directory), proceed without memory — don't error out.\nWriting Memory\n\nAfter discovering useful information, update ~/.config/vibe-notion/MEMORY.md using the Write tool. Write triggers include:\n\nAfter discovering workspace IDs (from workspace list)\nAfter discovering useful page IDs, database IDs, collection IDs (from search, page list, page get, database list, etc.)\nAfter the user gives you an alias or preference (\"call this the Tasks DB\", \"my main workspace is X\")\nAfter discovering page/database structure (parent-child relationships, what databases live under which pages)\n\nWhen writing, include the complete file content — the Write tool overwrites the entire file.\n\nWhat to Store\nWorkspace IDs with names\nPage IDs with titles and parent context\nDatabase/collection IDs with titles and parent context\nUser-given aliases (\"Tasks DB\", \"Main workspace\")\nCommonly used view IDs\nParent-child relationships (which databases are under which pages)\nAny user preference expressed during interaction\nWhat NOT to Store\n\nNever store token_v2, credentials, API keys, or any sensitive data. Never store full page content (just IDs and titles). Never store block-level IDs unless they're persistent references (like database blocks).\n\nHandling Stale Data\n\nIf a memorized ID returns an error (page not found, access denied), remove it from MEMORY.md. Don't blindly trust memorized data — verify when something seems off. Prefer re-searching over using a memorized ID that might be stale.\n\nFormat / Example\n\nHere's a concrete example of how to structure your MEMORY.md:\n\n# Vibe Notion Memory\n\n## Workspaces\n\n- `abc123-...` — Acme Corp (default)\n\n## Pages (Acme Corp)\n\n- `page-id-1` — Product Roadmap (top-level)\n- `page-id-2` — Q1 Planning (under Product Roadmap)\n\n## Databases (Acme Corp)\n\n- `coll-id-1` — Tasks (under Product Roadmap, views: `view-1`)\n- `coll-id-2` — Contacts (top-level)\n\n## Aliases\n\n- \"roadmap\" → `page-id-1` (Product Roadmap)\n- \"tasks\" → `coll-id-1` (Tasks database)\n\n## Notes\n\n- User prefers --pretty output for search results\n- Main workspace is \"Acme Corp\"\n\n\nMemory lets you skip repeated search and workspace list calls. When you already know an ID from a previous session, use it directly.\n\nCommands\nAuth Commands\nvibe-notion auth status     # Check authentication status\nvibe-notion auth logout     # Remove stored token_v2\nvibe-notion auth extract    # Manually re-extract token_v2 (for troubleshooting)\n\nPage Commands\n# List pages in a space (top-level only)\nvibe-notion page list --workspace-id <workspace_id> --pretty\nvibe-notion page list --workspace-id <workspace_id> --depth 2 --pretty\n\n# Get a page and all its content blocks\nvibe-notion page get <page_id> --workspace-id <workspace_id> --pretty\nvibe-notion page get <page_id> --workspace-id <workspace_id> --limit 50\nvibe-notion page get <page_id> --workspace-id <workspace_id> --backlinks --pretty\n\n# Create a new page (--parent is optional; omit to create at workspace root)\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Page\" --pretty\nvibe-notion page create --workspace-id <workspace_id> --title \"New Root Page\" --pretty\n\n\n# Create a page with markdown content\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Doc\" --markdown '# Hello\\n\\nThis is **bold** text.'\n\n# Create a page with markdown from a file\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Doc\" --markdown-file ./content.md\n\n# Create a page with markdown containing local images (auto-uploaded to Notion)\nvibe-notion page create --workspace-id <workspace_id> --parent <parent_id> --title \"My Doc\" --markdown-file ./doc-with-images.md\n\n# Replace all content on a page with new markdown\nvibe-notion page update <page_id> --workspace-id <workspace_id> --replace-content --markdown '# New Content'\nvibe-notion page update <page_id> --workspace-id <workspace_id> --replace-content --markdown-file ./updated.md\n\n# Update page title or icon\nvibe-notion page update <page_id> --workspace-id <workspace_id> --title \"New Title\" --pretty\nvibe-notion page update <page_id> --workspace-id <workspace_id> --icon \"🚀\" --pretty\n\n# Archive a page\nvibe-notion page archive <page_id> --workspace-id <workspace_id> --pretty\n\n# Get page or database row properties (without content blocks — lightweight alternative to page get)\nvibe-notion page properties <page_id> --workspace-id <workspace_id> --pretty\n\nDatabase Commands\n# Get database schema\nvibe-notion database get <database_id> --workspace-id <workspace_id> --pretty\n\n# Query a database (auto-resolves default view)\nvibe-notion database query <database_id> --workspace-id <workspace_id> --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --limit 10 --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --view-id <view_id> --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --search-query \"keyword\" --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --timezone \"America/New_York\" --pretty\n\n# Query with filter and sort (uses property IDs from database get schema)\nvibe-notion database query <database_id> --workspace-id <workspace_id> --filter '<filter_json>' --pretty\nvibe-notion database query <database_id> --workspace-id <workspace_id> --sort '<sort_json>' --pretty\n\n# List all databases in workspace\nvibe-notion database list --workspace-id <workspace_id> --pretty\n\n# Create a database\nvibe-notion database create --workspace-id <workspace_id> --parent <page_id> --title \"Tasks\" --pretty\nvibe-notion database create --workspace-id <workspace_id> --parent <page_id> --title \"Tasks\" --properties '{\"status\":{\"name\":\"Status\",\"type\":\"select\"}}' --pretty\n\n# Update database title or schema\nvibe-notion database update <database_id> --workspace-id <workspace_id> --title \"New Name\" --pretty\nvibe-notion database update <database_id> --workspace-id <workspace_id> --properties '{\"status\":{\"name\":\"Status\",\"type\":\"select\"}}' --pretty\nvibe-notion database update <database_id> --workspace-id <workspace_id> --title \"New Name\" --properties '{\"status\":{\"name\":\"Status\",\"type\":\"select\"}}' --pretty\n\n# Add a row to a database\nvibe-notion database add-row <database_id> --workspace-id <workspace_id> --title \"Row title\" --pretty\nvibe-notion database add-row <database_id> --workspace-id <workspace_id> --title \"Row title\" --properties '{\"Status\":\"In Progress\",\"Due\":{\"start\":\"2025-03-01\"}}' --pretty\n\n# Add row with date range\nvibe-notion database add-row <database_id> --workspace-id <workspace_id> --title \"Event\" --properties '{\"Due\":{\"start\":\"2026-01-01\",\"end\":\"2026-01-15\"}}' --pretty\n\n# Update properties on an existing database row (row_id from database query)\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Status\":\"Done\"}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Priority\":\"High\",\"Tags\":[\"backend\",\"infra\"]}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Due\":{\"start\":\"2026-06-01\"},\"Status\":\"In Progress\"}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Due\":{\"start\":\"2026-01-01\",\"end\":\"2026-01-15\"}}' --pretty\nvibe-notion database update-row <row_id> --workspace-id <workspace_id> --properties '{\"Related\":[\"<target_row_id>\"]}' --pretty\n\n# Delete a property from a database (cannot delete the title property)\nvibe-notion database delete-property <database_id> --workspace-id <workspace_id> --property \"Status\" --pretty\n\n# Get view configuration and property visibility\nvibe-notion database view-get <view_id> --workspace-id <workspace_id> --pretty\n\n# Show or hide properties on a view (comma-separated names)\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --show \"ID,Due\" --pretty\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --hide \"Assignee\" --pretty\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --show \"Status\" --hide \"Due\" --pretty\n\n# Reorder columns (comma-separated names in desired order; unmentioned columns appended)\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --reorder \"Name,Status,Priority,Date\" --pretty\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --reorder \"Name,Status\" --show \"Status\" --pretty\n\n# Resize columns (JSON mapping property names to pixel widths)\nvibe-notion database view-update <view_id> --workspace-id <workspace_id> --resize '{\"Name\":200,\"Status\":150}' --pretty\n\n# List all views for a database\nvibe-notion database view-list <database_id> --workspace-id <workspace_id> --pretty\n\n# Add a new view to a database (default type: table)\nvibe-notion database view-add <database_id> --workspace-id <workspace_id> --pretty\nvibe-notion database view-add <database_id> --workspace-id <workspace_id> --type board --name \"Board View\" --pretty\n\n# Delete a view from a database (cannot delete the last view)\nvibe-notion database view-delete <view_id> --workspace-id <workspace_id> --pretty\n\nBlock Commands\n# Get a specific block\nvibe-notion block get <block_id> --workspace-id <workspace_id> --pretty\nvibe-notion block get <block_id> --workspace-id <workspace_id> --backlinks --pretty\n\n# List child blocks\nvibe-notion block children <block_id> --workspace-id <workspace_id> --pretty\nvibe-notion block children <block_id> --workspace-id <workspace_id> --limit 50 --pretty\nvibe-notion block children <block_id> --workspace-id <workspace_id> --start-cursor '<next_cursor_json>' --pretty\n\n# Append child blocks\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --content '[{\"type\":\"text\",\"properties\":{\"title\":[[\"Hello world\"]]}}]' --pretty\n\n# Append markdown content as blocks\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown '# Hello\\n\\nThis is **bold** text.'\n\n# Append markdown from a file\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown-file ./content.md\n\n# Append markdown with local images (auto-uploaded to Notion)\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown-file ./doc-with-images.md\n\n# Append nested markdown (indented lists become nested children blocks)\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --markdown '- Parent item\\n  - Child item\\n    - Grandchild item'\n\n# Append blocks after a specific block (positional insertion)\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --after <block_id> --markdown '# Inserted after specific block'\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --after <block_id> --content '[{\"type\":\"text\",\"properties\":{\"title\":[[\"Inserted after\"]]}}]'\n\n# Append blocks before a specific block\nvibe-notion block append <parent_id> --workspace-id <workspace_id> --before <block_id> --markdown '# Inserted before specific block'\n\n# Update a block\nvibe-notion block update <block_id> --workspace-id <workspace_id> --content '{\"properties\":{\"title\":[[\"Updated text\"]]}}' --pretty\n\n# Delete a block\nvibe-notion block delete <block_id> --workspace-id <workspace_id> --pretty\n\n# Upload a file as a block (image or file block)\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./image.png --pretty\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./document.pdf --pretty\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./image.png --after <block_id> --pretty\nvibe-notion block upload <parent_id> --workspace-id <workspace_id> --file ./image.png --before <block_id> --pretty\n\n# Move a block to a new position\nvibe-notion block move <block_id> --workspace-id <workspace_id> --parent <parent_id> --pretty\nvibe-notion block move <block_id> --workspace-id <workspace_id> --parent <parent_id> --after <sibling_id> --pretty\nvibe-notion block move <block_id> --workspace-id <workspace_id> --parent <parent_id> --before <sibling_id> --pretty\n\nBlock Types & Rich Text Reference\n\nFor block type JSON format (headings, text, lists, to-do, code, quote, divider) and rich text formatting codes, see references/block-types.md.\n\nComment Commands\n# List comments on a page\nvibe-notion comment list --page <page_id> --workspace-id <workspace_id> --pretty\n\n# List inline comments on a specific block\nvibe-notion comment list --page <page_id> --block <block_id> --workspace-id <workspace_id> --pretty\n\n# Create a comment on a page (starts a new discussion)\nvibe-notion comment create \"This is a comment\" --page <page_id> --workspace-id <workspace_id> --pretty\n\n# Reply to an existing discussion thread\nvibe-notion comment create \"Replying to thread\" --discussion <discussion_id> --workspace-id <workspace_id> --pretty\n\n# Get a specific comment by ID\nvibe-notion comment get <comment_id> --workspace-id <workspace_id> --pretty\n\nBatch Operations\n\nFor batch command format, supported actions (14 total), operation JSON structure, output format, fail-fast behavior, bulk operations strategy (multi-pass pattern), and rate limit handling, see references/batch-operations.md.\n\nQuick usage:\n\n# Inline JSON\nvibe-notion batch --workspace-id <workspace_id> '<operations_json>'\n\n# From file (for large payloads)\nvibe-notion batch --workspace-id <workspace_id> --file ./operations.json '[]'\n\nSearch Command\n# Search across workspace (--workspace-id is required)\nvibe-notion search \"query\" --workspace-id <workspace_id> --pretty\nvibe-notion search \"query\" --workspace-id <workspace_id> --limit 10 --pretty\nvibe-notion search \"query\" --workspace-id <workspace_id> --start-cursor <offset> --pretty\nvibe-notion search \"query\" --workspace-id <workspace_id> --sort lastEdited --pretty\n\nUser Commands\n# Get current user info\nvibe-notion user me --pretty\n\n# Get a specific user\nvibe-notion user get <user_id> --workspace-id <workspace_id> --pretty\n\n# List users in a workspace\nvibe-notion user list --workspace-id <workspace_id> --pretty\n\nOutput Format\n\nAll commands output JSON by default. Use --pretty for human-readable output.\n\nFor JSON response shapes (search, database query, page get, block get, backlinks), $hints schema warnings, and detailed examples, see references/output-format.md.\n\nWhen to Use --backlinks\n\nBacklinks reveal which pages/databases link to a given page. This is critical for efficient navigation.\n\nUse --backlinks when:\n\nTracing relations: A search result looks like a select option, enum value, or relation target (e.g., a plan name or category). Backlinks instantly reveal all rows/pages that reference it via relation properties — no need to hunt for the parent database.\nFinding references: You found a page and want to know what other pages mention or link to it.\nReverse lookups: Instead of querying every database to find rows pointing to a page, use backlinks on the target page to get them directly.\n\nExample — finding who uses a specific plan:\n\n# BAD: 15 API calls — search, open empty pages, trace parents, find database, query\nvibe-notion search \"Enterprise Plan\" ...\nvibe-notion page get <plan-page-id> ...  # empty\nvibe-notion block get <plan-page-id> ...  # find parent\n# ... many more calls to discover the database\n\n# GOOD: 2-3 API calls — search, then backlinks on the target\nvibe-notion search \"Enterprise Plan\" ...\nvibe-notion page get <plan-page-id> --backlinks --pretty\n# → backlinks immediately show all people/rows linked to this plan\n\nPagination\n\nCommands that return lists support pagination via has_more, next_cursor fields:\n\nblock children: Cursor-based. Pass next_cursor value from previous response as --start-cursor.\nsearch: Offset-based. Pass next_cursor value (a number) as --start-cursor.\ndatabase query: Use --limit to control page size. has_more indicates more results exist, but the private API does not support cursor-based pagination — increase --limit to fetch more rows.\nTroubleshooting\nAuthentication failures\n\nIf auto-extraction fails (e.g., Notion desktop app is not installed or not logged in), run the extract command manually for debug output:\n\nvibe-notion auth extract --debug\n\n\nThis shows the Notion directory path and extraction steps to help diagnose the issue.\n\nDatabase locked during extraction\n\nIf auth extract fails with:\n\n{\"error\":\"No token_v2 found. Make sure Notion desktop app is installed and logged in.\"}\n\n\nAnd the Notion desktop app is installed and logged in, the cookie database may be locked by the running Notion app. Tell the user to quit the Notion desktop app completely, then retry the command. Once credentials are extracted, the user can reopen Notion.\n\nvibe-notion: command not found\n\nThe vibe-notion package is not installed. Run it directly using a package runner. Ask the user which one to use:\n\nnpx -y vibe-notion ...\nbunx vibe-notion ...\npnpm dlx vibe-notion ...\n\n\nIf you already know the user's preferred package runner, use it directly instead of asking.\n\nLimitations\nAuto-extraction supports macOS and Linux. Windows DPAPI decryption is not yet supported.\ntoken_v2 uses the unofficial internal API and may break if Notion changes it.\nThis is a private/unofficial API and is not supported by Notion."
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/devxoul/vibe-notion",
    "publisherUrl": "https://clawhub.ai/devxoul/vibe-notion",
    "owner": "devxoul",
    "version": "1.2.2",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/vibe-notion",
    "downloadUrl": "https://openagent3.xyz/downloads/vibe-notion",
    "agentUrl": "https://openagent3.xyz/skills/vibe-notion/agent",
    "manifestUrl": "https://openagent3.xyz/skills/vibe-notion/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/vibe-notion/agent.md"
  }
}