notion-cli
Access Notion via the 4ier/notion-cli Go binary. Use when user wants to search Notion, query databases, read pages, export data,
What this skill does
# Notion CLI
Fast, agent-friendly access to Notion via the `4ier/notion-cli` Go binary. Single static binary, sub-second startup, auto-JSON when piped.
> **Self-Evolving Skill**: Fix this file immediately if instructions drift. Do not defer.
## When to Use
Use this skill when the user wants to interact with Notion from the command line — searching pages, querying databases, reading content, exporting data, managing blocks, or adding comments. This wraps the Go binary `notion` (installed via `brew install 4ier/tap/notion-cli`).
Do NOT use this skill for programmatic Python automation with the Notion SDK — use `productivity-tools:notion-sdk` instead. This skill is for CLI-first, pipe-friendly operations.
## Preflight
Before any operation, verify the CLI is authenticated:
```bash
notion auth status
```
If not authenticated, retrieve the token from Doppler and authenticate:
```bash
doppler secrets get NOTION_API_TOKEN --project claude-config --config prd --plain | notion auth login --with-token
```
Fallback: prompt the user for their integration token.
## Output Formats
The CLI auto-detects context:
- **TTY** (interactive terminal): colored tables
- **Piped** (to `jq`, file, etc.): clean JSON
Force a format with `--format`:
| Flag | Output |
| ---------------- | ----------- |
| `--format json` | JSON |
| `--format table` | ASCII table |
| `--format md` | Markdown |
| `--format text` | Plain text |
For agent consumption, always pipe or use `--format json` to get structured output.
## Core Commands
### Search
```bash
notion search "meeting notes" # Search by title
notion search --type page "roadmap" # Pages only
notion search --type database # List all databases
notion search --all # Fetch all results (paginated)
notion search --limit 20 "query" # Limit results
```
### Pages
```bash
notion page view <page-id|url> # View page content (blocks as markdown)
notion page props <page-id|url> # Show page properties
notion page create --parent <id> --title "X" # Create a page
notion page set <id> --prop 'Status=Done' # Set property
notion page edit <id> # Edit in $EDITOR
notion page move <id> --to <parent-id> # Move page
notion page delete <id> # Archive page
notion page restore <id> # Restore archived page
notion page open <id> # Open in browser
notion page list # List accessible pages
```
### Databases
```bash
notion db list # List all databases
notion db view <db-id|url> # Show schema
notion db query <db-id|url> # Query all rows
notion db query <id> --filter 'Status=Done' # Simple filter
notion db query <id> --filter 'Date>=2026-01-01' --sort 'Date:desc'
notion db query <id> --filter-json '{"or":[...]}' # Complex filters
notion db query <id> --all # Fetch all pages
notion db export <id> --format csv -o data.csv # Export to CSV
notion db export <id> --format json # Export to JSON
notion db export <id> --format md # Export to Markdown table
notion db add <id> --prop 'Name=Task' --prop 'Status=Todo' # Add row
notion db add-bulk <id> --file rows.json # Bulk add from JSON
```
**Filter operators**: `=` `!=` `>` `>=` `<` `<=` `~=` (contains)
Multiple `--filter` flags are AND-combined. For OR logic, use `--filter-json`.
### Blocks
```bash
notion block list <page-id|url> # List child blocks
notion block list <id> --depth 3 # Recursive (3 levels)
notion block get <block-id> # Get specific block
notion block append <page-id> --md "# Hello" # Append markdown
notion block insert <after-block-id> --md "X" # Insert after block
notion block delete <block-id> # Delete block
notion block move <block-id> --to <parent-id> # Move block
```
### Comments
```bash
notion comment list <page-id> # List comments
notion comment add <page-id> --body "text" # Add comment
notion comment reply <comment-id> --body "X" # Reply to comment
```
### Users
```bash
notion user me # Current bot user
notion user list # Workspace users
notion user get <user-id> # User details
```
### Files
```bash
notion file upload <file-path> # Upload file
notion file list # List uploads
```
### Raw API (escape hatch)
```bash
notion api GET /v1/users/me
notion api POST /v1/search --body '{"query":"test"}'
echo '{"query":"test"}' | notion api POST /v1/search
```
## ID Resolution
The CLI accepts both Notion URLs and raw IDs interchangeably:
```bash
notion page view https://www.notion.so/My-Page-abc123def456
notion page view abc123def456
```
## Common Patterns
### Export entire database to JSON
```bash
notion db export <db-id> --format json -o database.json
```
### Search and pipe to jq
```bash
notion search "project" --format json | jq '.results[] | {title: .properties.title.title[0].plain_text, url: .url}'
```
### List all databases with their IDs
```bash
notion search --type database --all --format json | jq '.results[] | {id: .id, title: .title[0].plain_text}'
```
### Recursive page content dump
```bash
notion block list <page-id> --depth 10 --format md
```
## Credential Storage
| Store | Location | Purpose |
| ------- | ------------------------------------ | ---------------- |
| Doppler | `claude-config/prd:NOTION_API_TOKEN` | SSoT for token |
| CLI | `~/.config/notion/credentials.json` | Local auth cache |
Token format: `ntn_*` (Notion internal integration token).
## Troubleshooting
| Issue | Fix |
| ------------------ | -------------------------------------------------------------------- |
| `unauthorized` | Token expired/revoked — regenerate at notion.so/profile/integrations |
| `object not found` | Page not connected to integration — add via page menu > Connections |
| `rate_limited` | CLI auto-retries; for bulk ops use `--limit` to reduce batch size |
| `validation_error` | Check property names match schema: `notion db view <id>` |
## Post-Execution Reflection
After this skill completes, check before closing:
1. **Did the command succeed?** If not, fix the instruction or error table that caused the failure.
2. **Did parameters or output change?** If the CLI interface drifted, update usage examples and command tables.
3. **Was a workaround needed?** If you had to improvise (different flags, extra steps), update this SKILL.md so the next invocation doesn't need the same workaround.
Only update if the issue is real and reproducible — not speculative.
Related in Productivity
gitea-workflow
IncludedOrchestrate agile development workflows for Gitea repositories using the tea CLI. Use when working with Gitea-hosted repos and asking to 'run the workflow', 'continue working', 'what's next', 'complete the task cycle', 'start my day', 'end the sprint', 'implement the next task', or wanting guided step-by-step development assistance. Keywords: workflow, orchestrate, agile, task cycle, sprint, daily, implement, review, PR, standup, retrospective, gitea, tea.
microsoft-graph-gateway
IncludedRoute Microsoft Graph work in this workspace. Use when users want to read or write Outlook mail, calendar events, contacts, OneDrive or SharePoint files, Teams, Planner, To Do, users, groups, directory data, or arbitrary Microsoft Graph endpoints from VS Code. Prefer WorkIQ for common read scenarios. Use Microsoft Graph for write actions and gap-read scenarios that need exact Graph properties, filters, permissions, or endpoints.
copilotkit
IncludedUse when building with CopilotKit — setup, development, integrations, debugging, upgrading, or contributing. Routes to the appropriate specialized skill based on the task.
wordly-wisdom
IncludedProvides calibrated decision analysis using Charlie Munger-style multiple mental models, inversion, incentive mapping, circle-of-competence checks, misjudgment audits, second-order effects, and forecast updates. Use when the user asks for an oracle take, a hard call, a decision memo, a premortem, an outside view, a red-team, a sanity-check, what am I missing, think this through, or wants a strategy, hire, investment, plan, product, partnership, or major life choice analysed. Avoid for simple factual lookups or time-sensitive legal, medical, or market questions without fresh evidence.
swain-session
IncludedSession management and project status dashboard. Owns the full session lifecycle (start/work/close/resume), focus lane, bookmarks, worktree detection, and tab naming. Also serves as the project status dashboard — shows active epics, progress, actionable next steps, blocked items, tasks, GitHub issues, and recommendations. Worktree creation is deferred to swain-do task dispatch (SPEC-195). Triggers on: 'session', 'status', 'what's next', 'dashboard', 'overview', 'where are we', 'what should I work on', 'show me priorities', 'bookmark', 'focus on', 'session info'.
gandi
IncludedComprehensive Gandi domain registrar integration for domain and DNS management. Register and manage domains, create/update/delete DNS records (A, AAAA, CNAME, MX, TXT, SRV, and more), configure email forwarding and aliases, check SSL certificate status, create DNS snapshots for safe rollback, bulk update zone files, and monitor domain expiration. Supports multi-domain management, zone file import/export, and automated DNS backups. Includes both read-only and destructive operations with safety controls.