# notion-cli: OpenClaw/Claude Code Notion API skill — CRUD, filters, Markdown

Source: https://www.michaelchurley.com/blog/notion-cli-openclaw-skill-crud-markdown-property-filter  
Published: 2026-03-28  
Author: Michael C. Hurley  
Tags: notion-cli, notion, cli, typescript, bun, openclaw, claude-code, agent, markdown, skill, crud, michaelmonetized

## Who

I wanted agents to talk to Notion without a scrape wrapper and without pasting JSON into the wrong curl.

For OpenClaw / Claude Code workflows that need db/page/block CRUD, property-filtered page lists, and Markdown out of page content.

## What

I built **notion-cli** — public https://github.com/michaelmonetized/notion-cli. HEAD `5309974`. **1** commit. **0** stars. Default **main**. Version **1.0.0** (CLI banner still says **v2.0.0**). CLI / agent skill only.

**Shipped (~1145 LOC src):** `notion db|page|pages|block|search|spaces` via Bun + @notionhq/client v3. Vitest + Biome. `bun build --compile` → `dist/notion`.

![CLI subcommands](/blog/notion-cli-openclaw-skill-crud-markdown-property-filter/screenshots/cli-subcommands.png)

![Agent skill install](/blog/notion-cli-openclaw-skill-crud-markdown-property-filter/screenshots/agent-skill-install.png)

**Agent path:** `./setup` → OpenClaw `~/.openclaw/workspace/bin/notion` or `./setup --host codex` → `~/.claude/skills/notion`. Full command reference in **SKILL.md**.

**Filters + Markdown:** `pages list <db> -p "Name,Tags"` / `-n "Status"`; `page content <id>` → block-to-Markdown.

![Docs vs HEAD](/blog/notion-cli-openclaw-skill-crud-markdown-property-filter/screenshots/docs-vs-head-gap.png)

**Gaps:** package 1.0.0 vs banner v2.0.0; DELIVERY/FINAL-DELIVERY still flat `list-databases`; unused `spaces.ts`/`page.ts`/`search.ts` modules; `spaces list` aliases db list; orphan empty postcss.config.js.

![Architecture](/blog/notion-cli-openclaw-skill-crud-markdown-property-filter/screenshots/architecture-stack.png)

## Where

Code: https://github.com/michaelmonetized/notion-cli — public. No live web app.

Run: `export NOTION_API_KEY=…` && `bun install` && `bun build src/cli.ts --compile --outfile dist/notion` (or `./setup`).

## When

**2026-03-28** — 5309974 Initial commit: production-ready Notion CLI (+29 files) → HEAD.

## Why

![Commit arc](/blog/notion-cli-openclaw-skill-crud-markdown-property-filter/screenshots/commit-arc.png)

Because agents need a typed Notion subcommand surface with Markdown out — not another unofficial scrape.
**Engagement Q:** Align package + banner to 1.0.0 and delete flat-command DELIVERY docs, or finish a real spaces API first?
