Notion Enhanced
Integrate with Notion workspaces to read pages, query databases, create entries, and manage content. Perfect for knowledge bases, project tracking, content calendars, CRMs, and collaborative documenta
Integrate with Notion workspaces to read pages, query databases, create entries, and manage content. Perfect for knowledge bases, project tracking, content calendars, CRMs, and collaborative documenta
Real data. Real impact.
Growing
Developers
Per week
Open source
Skills give you superpowers. Install in 30 seconds.
Connect your Notion workspace to OpenClaw for seamless knowledge management and project tracking.
Use Notion when the user wants to:
secret_)NOTION_TOKEN=secret_...Important: Notion integrations have NO access by default. You must explicitly share:
From URL:
https://www.notion.so/workspace/XXXXXXXX?v=... → ID is XXXXXXXX (32 chars)https://www.notion.so/workspace/XXXXXXXX → ID is XXXXXXXXNote: Remove hyphens when using IDs. Use the 32-character string.
Retrieve entries from any database you've shared.
// Using the Notion skill via exec await exec({ command: `node ~/.agents/skills/notion/notion-cli.js query-database ${databaseId}` });// With filters (example: status = "In Progress") await exec({ command:});node ~/.agents/skills/notion/notion-cli.js query-database ${databaseId} --filter '{"property":"Status","select":{"equals":"In Progress"}}'
Returns: Array of pages with properties as configured in your database.
Create a new row in a database.
// Add entry with multiple properties await exec({ command: `node ~/.agents/skills/notion/notion-cli.js add-entry ${databaseId} \ --title "My New Content Idea" \ --properties '${JSON.stringify({ "Status": { "select": { "name": "Idea" } }, "Platform": { "multi_select": [{ "name": "X/Twitter" }] }, "Tags": { "multi_select": [{ "name": "3D Printing" }, { "name": "AI" }] }, "Priority": { "select": { "name": "High" } } })}'` });
Read the content of any page (including database entries).
await exec({ command: `node ~/.agents/skills/notion/notion-cli.js get-page ${pageId}` });
Returns: Page title, properties, and block content (text, headings, lists, etc.).
Modify properties or append content to an existing page.
// Update properties await exec({ command: `node ~/.agents/skills/notion/notion-cli.js update-page ${pageId} \ --properties '${JSON.stringify({ "Status": { "select": { "name": "In Progress" } } })}'` });// Append content blocks await exec({ command:});node ~/.agents/skills/notion/notion-cli.js append-body ${pageId} \ --text "Research Notes" --type h2
Find pages across your shared workspace.
await exec({ command: `node ~/.agents/skills/notion/notion-cli.js search "content ideas"` });
Database Structure:
OpenClaw Integration:
// Research scout adds findings to Notion await exec({ command: `node ~/.agents/skills/notion/notion-cli.js add-entry ${contentDbId} \ --title "New 3D Print Technique" \ --properties '${JSON.stringify({ "Status": { "select": { "name": "Idea" } }, "Platform": { "multi_select": [{ "name": "YouTube" }] }, "Tags": { "multi_select": [{ "name": "3D Printing" }] } })}'` });// Later: Update when drafting await exec({ command:});node ~/.agents/skills/notion/notion-cli.js update-page ${entryId} \ --properties '${JSON.stringify({ "Status": { "select": { "name": "Draft" } }, "Draft Content": { "rich_text": [{ "text": { "content": "Draft text here..." } }] } })}'
Database Structure:
Weekly Review Integration:
// Query all "In Progress" projects await exec({ command: `node ~/.agents/skills/notion/notion-cli.js query-database ${projectsDbId} --filter '{"property":"Status","select":{"equals":"In Progress"}}'` });
Database Structure:
Shopify Integration:
// New order → create CRM entry await exec({ command: `node ~/.agents/skills/notion/notion-cli.js add-entry ${crmDbId} \ --title "${customerName}" \ --properties '${JSON.stringify({ "Status": { "select": { "name": "Ordered" } }, "Email": { "email": customerEmail }, "Shopify Order ID": { "rich_text": [{ "text": { "content": orderId } }] } })}'` });
Structure: Hub page with nested pages:
Query for quick reference:
// Search for "stringing" to find 3D print troubleshooting await exec({ command: `node ~/.agents/skills/notion/notion-cli.js search "stringing"` });
When creating/updating database entries, use these property value formats:
// Title (always required for new pages) { "title": [{ "text": { "content": "Page Title" } }] }// Select (single choice) { "select": { "name": "Option Name" } }
// Multi-select (multiple choices) { "multi_select": [{ "name": "Tag 1" }, { "name": "Tag 2" }] }
// Status (for new Status property type) { "status": { "name": "In progress" } }
// Text / Rich text { "rich_text": [{ "text": { "content": "Your text here" } }] }
// Number { "number": 42 }
// Date { "date": { "start": "2026-02-15" } } { "date": { "start": "2026-02-15T10:00:00", "end": "2026-02-15T12:00:00" } }
// Checkbox { "checkbox": true }
// Email { "email": "user@example.com" }
// URL { "url": "https://example.com" }
// Phone { "phone_number": "+1-555-123-4567" }
// Relation (link to another database entry) { "relation": [{ "id": "related-page-id-32chars" }] }
Critical Security Model:
~/.openclaw/.env (never in code)NOTION_TOKEN to gitBest Practices:
Add to
~/.openclaw/.env:
NOTION_TOKEN=secret_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Or set per-command:
NOTION_TOKEN=secret_xxx node notion-cli.js ...
Common errors and fixes:
| Error | Cause | Fix |
|---|---|---|
| "API token is invalid" | Wrong token or integration deleted | Check token at notion.so/my-integrations |
| "object_not_found" | Page not shared with integration | Share page: Share → Add connections |
| "validation_error" | Property format incorrect | Check property type in database |
| "rate_limited" | Too many requests | Add delay between requests |
cd ~/.agents/skills/notion ./install.sh
Manual install (if above fails):
cd ~/.agents/skills/notion npm install
That's it! No build step required for the standalone version.
# After setting NOTION_TOKEN in ~/.openclaw/.env node notion-cli.js test
Reference entries by Notion auto-ID (e.g.,
#3) or direct UUID.
Use the number you see in your database's ID column:
# Get entry #3 node notion-cli.js get-page '#3' DATABASE_IDAdd content to entry #3
node notion-cli.js append-body '#3' --database DATABASE_ID
--text "Research notes" --type h2Add bullet to entry #3
node notion-cli.js append-body '#3' --database DATABASE_ID
--text "Key finding" --type bullet
# Using full UUID from Notion URL node notion-cli.js get-page 2fb3e4ac... node notion-cli.js append-body 2fb3e4ac... \ --text "Content" --type paragraph
Auto-detection: Starts with
# = Notion ID lookup. 32-char hex = Direct UUID.
Pro Tip: Add an
ID property (type: unique ID) to auto-number entries as #1, #2, #3...
Add rich content to page bodies, not just properties.
# Add heading node notion-cli.js append-body PAGE_ID --text "Research Summary" --type h2Add paragraph (default)
node notion-cli.js append-body PAGE_ID --text "Detailed findings go here..."
Add bullet list item
node notion-cli.js append-body PAGE_ID --text "First key finding" --type bullet
Add numbered list item
node notion-cli.js append-body PAGE_ID --text "Step one description" --type numbered
Add TODO checkbox
node notion-cli.js append-body PAGE_ID --text "Create video script" --type todo
Add quote
node notion-cli.js append-body PAGE_ID --text "Important quote from source" --type quote
Add code block
node notion-cli.js append-body PAGE_ID --text "const result = optimizeSupports();" --type code --lang javascript
| Type | Description | Example Use |
|---|---|---|
| Regular text (default) | Descriptions, explanations |
, , | Headings | Section organization |
| Bulleted list | Key findings, features |
| Numbered list | Step-by-step instructions |
| Checkbox item | Action items, tasks |
| Blockquote | Source citations |
| Code block | Snippets, commands |
| Horizontal line | Section separation |
# Get full page including formatted body node notion-cli.js get-page PAGE_ID
Returns:
For complex layouts, use raw Notion block JSON:
node notion-cli.js append-body PAGE_ID --blocks '[ {"object":"block","type":"heading_2","heading_2":{"rich_text":[{"text":{"content":"Research Notes"}}]}}, {"object":"block","type":"bulleted_list_item","bulleted_list_item":{"rich_text":[{"text":{"content":"Finding 1"}}]}}, {"object":"block","type":"code","code":{"rich_text":[{"text":{"content":"console.log(1)"}}],"language":"javascript"}} ]'
For bidirectional sync (Notion changes → OpenClaw):
See references/webhooks.md for implementation details.
Need help? Check your Notion integration settings at https://www.notion.so/my-integrations
# 1. Install cd ~/.agents/skills/notion npm install2. Configure token
echo "NOTION_TOKEN=secret_xxxxxxxxxx" >> ~/.openclaw/.env
3. Test connection
node notion-cli.js test
// Query database await exec({ command: `node ~/.agents/skills/notion/notion-cli.js query-database YOUR_DB_ID` });// Add entry await exec({ command:
});node ~/.agents/skills/notion/notion-cli.js add-entry YOUR_DB_ID \\ --title "New Content Idea" \\ --properties '{"Status":{"select":{"name":"Idea"}}}'// Search await exec({ command:});node ~/.agents/skills/notion/notion-cli.js search "tree support"
Update your Research Topic Scout to push to Notion:
"message": "Research trends and add to Notion: node ~/.agents/skills/notion/notion-cli.js add-entry DB_ID --title '<title>' --properties '{...,\"Platform\":{\"multi_select\":[{\"name\":\"X\"}]}}'"
No automatic installation available. Please visit the source repository for installation instructions.
View Installation Instructions1,500+ AI skills, agents & workflows. Install in 30 seconds. Part of the Torly.ai family.
© 2026 Torly.ai. All rights reserved.