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_ID
# Add content to entry #3
node notion-cli.js append-body '#3' --database DATABASE_ID \
--text "Research notes" --type h2
# Add 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 h2
# Add 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 |
|---|---|---|
| ------ | ------------- | ------------- |
paragraph | Regular text (default) | Descriptions, explanations |
h1, h2, h3 | Headings | Section organization |
bullet | Bulleted list | Key findings, features |
numbered | Numbered list | Step-by-step instructions |
todo | Checkbox item | Action items, tasks |
quote | Blockquote | Source citations |
code | Code block | Snippets, commands |
divider | 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 install
# 2. 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\"}]}}'"
共 1 个版本