From better-notion-mcp
Bulk updates properties or content across many pages in a Notion database using pagination, dry-run previews, progress tracking, error recovery, and rate limit handling.
npx claudepluginhub n24q02m/better-notion-mcpThis skill uses the workspace's default tool permissions.
Update properties or content across many pages in a database safely.
Query Notion databases with filters/sorts, create/update pages with typed properties, and retrieve content using Notion API.
Interacts with Notion API via REST: authenticate, CRUD pages/databases/blocks/comments, pagination, error handling using curl/jq or scripts. For Notion tasks.
Interact with Notion workspaces via official API CLI to manage pages, databases, blocks, users, comments, and search. Use for automation without direct API calls.
Share bugs, ideas, or general feedback.
Update properties or content across many pages in a database safely.
Notion returns max 100 results per query. You MUST paginate to process all pages:
# First query
databases(action="query", database_id="<id>", filter={...}, page_size=100)
# Response includes: has_more=true, next_cursor="abc123"
# Continue until has_more=false
databases(action="query", database_id="<id>", filter={...}, page_size=100, start_cursor="abc123")
Never assume a single query returns all results. Always check has_more.
Before making any changes, ALWAYS show the user what will change:
Example dry-run output:
Found 23 pages matching filter. Changes:
1. "Project Alpha" -- Status: "Active" -> "Archived"
2. "Project Beta" -- Status: "Active" -> "Archived"
...
(21 more)
Proceed with update? (yes/no)
After user confirms:
Track progress -- maintain counters:
succeeded: pages updated successfullyfailed: pages that errored (with page ID and error message)skipped: pages already in target stateUpdate each page:
pages(action="update", page_id="<id>", properties={
"Status": { "select": { "name": "Archived" } }
})
Rate limit awareness:
Error recovery:
Remember the nested format (same as organize-database skill):
// Properties must use typed nested objects
{ "Status": { "select": { "name": "Done" } } }
{ "Tags": { "multi_select": [{ "name": "urgent" }, { "name": "review" }] } }
{ "Priority": { "number": 1 } }
{ "Reviewed": { "checkbox": true } }
archived: true on pages matching criteria{ "rich_text": [] })