🎁 Get the FREE AI Skills Starter Guide β€” Subscribe β†’
BytesAgainBytesAgain
πŸ¦€ ClawHub

Notion Agent

by @chloepark85

Notion integration for OpenClaw. Manage pages, databases, and blocks via AI agent.

Versionv1.0.1
Downloads640
TERMINAL
clawhub install notion-agent

πŸ“– About This Skill


name: notion-agent description: "Notion integration for OpenClaw. Manage pages, databases, and blocks via AI agent." license: "MIT-0" metadata: { "openclaw": { "emoji": "πŸ“", "requires": { "bins": ["uv"] }, "primaryEnv": "NOTION_TOKEN", }, }

Notion Agent

OpenClaw skill for managing Notion workspaces via AI agents. Provides CLI commands for pages, databases, blocks, and search.

Setup

1. Create a Notion Integration: - Go to https://www.notion.so/my-integrations - Click "New integration" - Give it a name (e.g., "OpenClaw") - Copy the "Internal Integration Token"

2. Set environment variable:

   export NOTION_TOKEN=your_integration_token_here
   

3. Share pages/databases with your integration: - Open the page or database in Notion - Click "..." β†’ "Add connections" - Select your integration

Usage

All commands use the pattern:

uv run {baseDir}/scripts/notion.py  [options]

Page Operations

Create a page:

uv run {baseDir}/scripts/notion.py page create \
  --parent  \
  --title "My New Page" \
  --content "Initial paragraph content"

Get a page:

uv run {baseDir}/scripts/notion.py page get 

Update a page:

uv run {baseDir}/scripts/notion.py page update  \
  --title "Updated Title"

Delete (archive) a page:

uv run {baseDir}/scripts/notion.py page delete 

List child pages:

uv run {baseDir}/scripts/notion.py page list --parent 

Database Operations

Query a database:

# Simple query
uv run {baseDir}/scripts/notion.py db query 

With filter

uv run {baseDir}/scripts/notion.py db query --filter Name=Todo

With sort

uv run {baseDir}/scripts/notion.py db query --sort Priority:desc

Add page to database:

uv run {baseDir}/scripts/notion.py db add  \
  --props '{"Name":{"title":[{"text":{"content":"Task"}}]},"Status":{"select":{"name":"Done"}}}'

List all databases:

uv run {baseDir}/scripts/notion.py db list

Block Operations

Append paragraph:

uv run {baseDir}/scripts/notion.py block append  \
  --type paragraph \
  --text "This is a paragraph"

Append to-do:

uv run {baseDir}/scripts/notion.py block append  \
  --type todo \
  --text "Task to complete" \
  --checked

Append heading:

uv run {baseDir}/scripts/notion.py block append  \
  --type heading1 \
  --text "Section Title"

Append code block:

uv run {baseDir}/scripts/notion.py block append  \
  --type code \
  --text "print('Hello, World!')" \
  --language python

List child blocks:

uv run {baseDir}/scripts/notion.py block children 

Search

Search workspace:

# Search all
uv run {baseDir}/scripts/notion.py search "project plan"

Search only pages

uv run {baseDir}/scripts/notion.py search "meeting notes" --type page

Search only databases

uv run {baseDir}/scripts/notion.py search "tasks" --type database

Error Handling

The CLI handles common errors:

  • NOTION_TOKEN not set β€” Set the environment variable
  • Invalid NOTION_TOKEN β€” Check your integration token
  • Resource not found β€” Page/database doesn't exist or integration lacks access
  • Permission denied β€” Share the resource with your integration
  • API Reference

  • Base URL: https://api.notion.com/v1
  • API Version: 2022-06-28
  • Authentication: Bearer token via NOTION_TOKEN
  • Limitations

  • Uses requests library only (no Notion SDK)
  • Simple filter/sort syntax (single property)
  • Rich text limited to plain text content
  • Database properties must be formatted as JSON
  • Examples for AI Agents

    Create a meeting notes page:

    uv run {baseDir}/scripts/notion.py page create \
      --parent  \
      --title "Meeting Notes - 2026-03-10" \
      --content "Attendees: Team"
    

    Add task to project database:

    uv run {baseDir}/scripts/notion.py db add  \
      --props '{"Name":{"title":[{"text":{"content":"Fix bug #123"}}]},"Status":{"select":{"name":"In Progress"}},"Priority":{"select":{"name":"High"}}}'
    

    Build a structured page:

    PAGE_ID=$(uv run {baseDir}/scripts/notion.py page create --parent  --title "Report" | jq -r .id)
    uv run {baseDir}/scripts/notion.py block append $PAGE_ID --type heading1 --text "Executive Summary"
    uv run {baseDir}/scripts/notion.py block append $PAGE_ID --type paragraph --text "Key findings..."
    uv run {baseDir}/scripts/notion.py block append $PAGE_ID --type heading2 --text "Details"
    uv run {baseDir}/scripts/notion.py block append $PAGE_ID --type todo --text "Review findings"
    

    Help

    uv run {baseDir}/scripts/notion.py --help
    uv run {baseDir}/scripts/notion.py page --help
    uv run {baseDir}/scripts/notion.py db --help
    uv run {baseDir}/scripts/notion.py block --help
    

    πŸ’‘ Examples

    All commands use the pattern:

    uv run {baseDir}/scripts/notion.py  [options]
    

    Page Operations

    Create a page:

    uv run {baseDir}/scripts/notion.py page create \
      --parent  \
      --title "My New Page" \
      --content "Initial paragraph content"
    

    Get a page:

    uv run {baseDir}/scripts/notion.py page get 
    

    Update a page:

    uv run {baseDir}/scripts/notion.py page update  \
      --title "Updated Title"
    

    Delete (archive) a page:

    uv run {baseDir}/scripts/notion.py page delete 
    

    List child pages:

    uv run {baseDir}/scripts/notion.py page list --parent 
    

    Database Operations

    Query a database:

    # Simple query
    uv run {baseDir}/scripts/notion.py db query 

    With filter

    uv run {baseDir}/scripts/notion.py db query --filter Name=Todo

    With sort

    uv run {baseDir}/scripts/notion.py db query --sort Priority:desc

    Add page to database:

    uv run {baseDir}/scripts/notion.py db add  \
      --props '{"Name":{"title":[{"text":{"content":"Task"}}]},"Status":{"select":{"name":"Done"}}}'
    

    List all databases:

    uv run {baseDir}/scripts/notion.py db list
    

    Block Operations

    Append paragraph:

    uv run {baseDir}/scripts/notion.py block append  \
      --type paragraph \
      --text "This is a paragraph"
    

    Append to-do:

    uv run {baseDir}/scripts/notion.py block append  \
      --type todo \
      --text "Task to complete" \
      --checked
    

    Append heading:

    uv run {baseDir}/scripts/notion.py block append  \
      --type heading1 \
      --text "Section Title"
    

    Append code block:

    uv run {baseDir}/scripts/notion.py block append  \
      --type code \
      --text "print('Hello, World!')" \
      --language python
    

    List child blocks:

    uv run {baseDir}/scripts/notion.py block children 
    

    Search

    Search workspace:

    # Search all
    uv run {baseDir}/scripts/notion.py search "project plan"

    Search only pages

    uv run {baseDir}/scripts/notion.py search "meeting notes" --type page

    Search only databases

    uv run {baseDir}/scripts/notion.py search "tasks" --type database

    βš™οΈ Configuration

    1. Create a Notion Integration: - Go to https://www.notion.so/my-integrations - Click "New integration" - Give it a name (e.g., "OpenClaw") - Copy the "Internal Integration Token"

    2. Set environment variable:

       export NOTION_TOKEN=your_integration_token_here
       

    3. Share pages/databases with your integration: - Open the page or database in Notion - Click "..." β†’ "Add connections" - Select your integration