A Claude Code skill that lets you batch-write structured data (CSV, JSON, Markdown tables) into Notion databases via the Notion MCP integration. Write-only by design — no delete operations allowed.
- Batch create Notion databases with auto-detected schemas
- Bulk insert up to 100 pages per API call from CSV/JSON/Markdown
- Auto-map data types to Notion property types (Title, Number, Select, Checkbox, Date, etc.)
- Create-only by default — skill prohibits delete operations; updates require explicit user approval
- Progress reporting — shows batch-by-batch progress for large datasets
- Claude Code installed
- Notion MCP integration enabled in Claude Code (Settings → Connected Apps → Notion)
- Notion workspace with appropriate permissions
# In your project directory
mkdir -p .claude/skills/notion-batch-writer
curl -o .claude/skills/notion-batch-writer/SKILL.md \
https://raw.githubusercontent.com/jquser3-blip/notion-batch-writer/main/notion-batch-writer/SKILL.mdmkdir -p ~/.claude/skills/notion-batch-writer
curl -o ~/.claude/skills/notion-batch-writer/SKILL.md \
https://raw.githubusercontent.com/jquser3-blip/notion-batch-writer/main/notion-batch-writer/SKILL.mdOnce installed, just describe what you want in Claude Code:
把這個 CSV 寫入 Notion
Write this JSON file to a new Notion database
Import strategies.csv into my existing "Trading Strategies" database
從 Markdown 表格建立 Notion 資料庫
> 把 data/strategies.csv 寫入 Notion,建在「交易筆記」頁面下面
Claude will:
- Read
strategies.csv - Auto-detect columns and types
- Show you a preview and ask to confirm
- Create the database under "交易筆記"
- Batch-insert all rows
- Return the database URL
> 把 results.json 的資料加到現有的 Notion 資料庫 "Backtest Results"
Claude will:
- Read
results.json - Search Notion for "Backtest Results" database
- Fetch the schema and map fields
- Insert all entries
> 把下面的表格寫入 Notion:
>
> | 策略 | 勝率 | 年化 |
> |------|------|------|
> | IBS | 64% | 12% |
> | TPE | 72% | 22% |
| Format | How to use |
|---|---|
| CSV | Point to a .csv file path |
| JSON | Point to a .json file (array of objects) |
| Markdown table | Paste inline or point to a .md file |
| Notion Type | Auto-detected from |
|---|---|
| Title | First text column or column named "Name"/"Title" |
| Rich Text | Free-form text columns |
| Number | Numeric values |
| Select | Columns with repeating categorical values |
| Multi-Select | Comma-separated tag lists |
| Checkbox | Yes/No, True/False, 1/0 values |
| Date | ISO date strings, common date formats |
| URL | Strings starting with http/https |
| Strings with @ symbol | |
| Unique ID | Auto-increment identifiers |
This skill is create-only by default:
- Default mode appends new pages only — no overwrites, no deletes
- Updates require explicit user approval with exact page ID
- Only uses
notion-create-database,notion-create-pages,notion-search,notion-fetch, andnotion-update-page notion-update-pagerestricted toupdate_propertiesandupdate_content(neverreplace_content)allow_deleting_contentis alwaysfalsedisable-model-invocation: true— Claude will never auto-trigger this skill; user must invoke it explicitly- Dry-run preview before every first write
- Duplicate detection: skips rows whose title already exists (configurable)
- Maximum 100 pages per batch (Notion API limit)
- Cannot create relation properties to databases that don't exist yet
- Cannot upload files/images as property values
- SELECT options are auto-created if they don't exist in the schema
MIT
Issues and PRs welcome at github.com/jquser3-blip/notion-batch-writer