From shared-utils
This skill should be used when the user asks to "connect to Notion", "search Notion pages", "create Notion page", "read Notion database", "update Notion content", or mentions Notion workspace operations. Keywords: Notion, notes, database, workspace.
npx claudepluginhub n0rvyn/indie-toolkit --plugin shared-utilsThis skill is limited to using the following tools:
Connect to Notion workspace and perform authorized operations: search, read, create, update pages and databases.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Migrates code, prompts, and API calls from Claude Sonnet 4.0/4.5 or Opus 4.1 to Opus 4.5, updating model strings on Anthropic, AWS, GCP, Azure platforms.
Analyzes BMad project state from catalog CSV, configs, artifacts, and query to recommend next skills or answer questions. Useful for help requests, 'what next', or starting BMad.
Connect to Notion workspace and perform authorized operations: search, read, create, update pages and databases.
Before first use, complete the setup:
.env file (install location depends on how the plugin was installed):
NOTION_TOKEN=your_internal_integration_secret
NOTION_WORKSPACE=Collector
NOTION_VERSION=2022-06-28
Default load paths (first match wins):
$NOTION_ENV_PATH if set${plugin_install_dir}/skills/notion-with-api/.env~/.claude/skills/notion-with-api/.env (legacy global-skill location; kept for back-compat)... → Connect to → Select your integrationpython3 ~/.claude/skills/notion/scripts/notion_api.py verify
python3 ~/.claude/skills/notion/scripts/notion_api.py search "keyword"
python3 ~/.claude/skills/notion/scripts/notion_api.py list-databases
IMPORTANT: Always run this first before creating database items to understand available properties and their types.
python3 ~/.claude/skills/notion/scripts/notion_api.py get-db-schema DATABASE_ID
Example output:
Database: Document Hub
ID: 2f4fd878-f624-8057-a70e-deaaf68d71ae
Properties:
- Doc name (title)
- Category (multi_select)
Options: Proposal, Customer research, Strategy doc, Planning
- Created by (created_by)
(auto-populated)
python3 ~/.claude/skills/notion/scripts/notion_api.py read-page PAGE_ID
Deletes all existing blocks, then appends new blocks from markdown. Page title is preserved.
# From file
python3 ~/.claude/skills/notion/scripts/notion_api.py update-page PAGE_ID --file /path/to/content.md
# From string
python3 ~/.claude/skills/notion/scripts/notion_api.py update-page PAGE_ID --content "## New content"
Leading # H1 lines are stripped (page title is separate from body content in Notion).
python3 ~/.claude/skills/notion/scripts/notion_api.py query-db DATABASE_ID
Use this when the parent is a page (not a database):
python3 ~/.claude/skills/notion/scripts/notion_api.py create-page PARENT_PAGE_ID "Page Title" "Page content"
Use this when creating an item in a database:
# From string
python3 ~/.claude/skills/notion/scripts/notion_api.py create-db-item DATABASE_ID "Item Title" \
--props '{"PropertyName": "value"}' \
--content "Optional page content"
# From file (overrides --content)
python3 ~/.claude/skills/notion/scripts/notion_api.py create-db-item DATABASE_ID "Item Title" \
--props '{"PropertyName": "value"}' \
--file /path/to/content.md
| Type | Example Value | Notes |
|---|---|---|
| title | "My Title" | Auto-detected from schema |
| rich_text | "Some text" | Plain text string |
| number | 42 or 3.14 | Numeric value |
| select | "Option Name" | Single option name |
| multi_select | "Opt1, Opt2" | Comma-separated options |
| date | "2026-01-26" or "today" | ISO date or "today" |
| checkbox | true or false | Boolean value |
| url | "https://..." | Full URL |
"user@example.com" | Email address | |
| phone_number | "+1234567890" | Phone number string |
Auto-populated properties (created_by, created_time, last_edited_by, last_edited_time) are set by Notion automatically.
Create document with category:
python3 ~/.claude/skills/notion/scripts/notion_api.py create-db-item \
2f4fd878-f624-8057-a70e-deaaf68d71ae \
"Q1 Marketing Plan" \
--props '{"Category": "Strategy doc"}' \
--content "This document outlines our Q1 marketing strategy."
Create todo item:
python3 ~/.claude/skills/notion/scripts/notion_api.py create-db-item \
2b0fd878-f624-8011-98c2-ed0babd6beb4 \
"Review pull requests" \
--props '{"Due Date": "2026-01-27", "Done": false}'
Create item with multiple categories:
python3 ~/.claude/skills/notion/scripts/notion_api.py create-db-item \
DATABASE_ID \
"Research Report" \
--props '{"Category": "Customer research, Strategy doc"}'
| Name | ID | Properties |
|---|---|---|
| Document Hub | 2f4fd878-f624-8057-a70e-deaaf68d71ae | Doc name, Category (multi_select) |
| To Do List DB | 2b0fd878-f624-8011-98c2-ed0babd6beb4 | Name, Due Date (date), Done (checkbox) |
| Code | Description | Solution |
|---|---|---|
| 401 | Invalid token | Check NOTION_TOKEN in .env |
| 403 | No permission | Add integration connection in Notion |
| 404 | Resource not found | Verify ID is correct AND integration is connected |
| 400 | Validation error | Check property names/types with get-db-schema |
verify to check tokensearch or list-databasesget-db-schema DATABASE_ID to see propertiescreate-db-item with correct property names| Endpoint | Method | Description |
|---|---|---|
/v1/users/me | GET | Get current user info |
/v1/search | POST | Search pages and databases |
/v1/pages/{id} | GET | Get page |
/v1/pages | POST | Create page |
/v1/databases/{id} | GET | Get database schema |
/v1/databases/{id}/query | POST | Query database |
Notion API: https://developers.notion.com/reference/introduction