Install
openclaw skills install notion-second-brain-setupOne-shot Notion workspace scaffolder for the second-brain skill. Creates or adopts the "Second Brain" parent page and its child databases (Reading List, Inbox) using the exact Notion MCP tools — no freelance pages.
openclaw skills install notion-second-brain-setupYou will execute a fixed sequence of Notion MCP tool calls. You are NOT to invent pages, write markdown content, or call any tool not listed in the sequence below.
✅ The only output of this skill:
Second Brain (no body content, no icon, no cover)Reading List as a child of that pageInbox as a child of that page❌ Forbidden — even if your training suggests them:
Second Brain parent pagenotion-create-pages to create something that should be a databaseIf you find yourself about to call notion-create-pages with a content field longer than 0 characters, STOP — you are about to do the wrong thing.
Execute in order. Stop and report on first hard failure.
The Notion integration can only create pages under a page it has been shared with. There is no "workspace root" creation path.
Call notion-search with:
{"query": "", "query_type": "internal"}
This returns every page the integration can see. From the results:
Second Brain, save its page_id as SECOND_BRAIN_ID and skip to Step 2.INTEGRATION_PARENT_ID. Prefer one that looks like a top-level workspace page (no parent, or named like Home, Workspace, IronClaw, etc.).
No pages accessible to the integration. In Notion, create a page (e.g. "IronClaw") and share it with the integration (... → Connections → IronClaw), then run setup again.
Second Brain parent pageOnly run this step if SECOND_BRAIN_ID was not found in Step 0.
Call notion-create-pages with exactly this payload — no other fields:
{
"pages": [
{
"parent": {"type": "page_id", "page_id": "<INTEGRATION_PARENT_ID>"},
"properties": {"title": "Second Brain"}
}
]
}
Do NOT include any of these fields, even as empty values: content, icon, cover, template_id, children, tags, description. The pages[0] object must contain exactly two keys: parent and properties. If you write any other key, you are violating this skill.
Save the returned page_id as SECOND_BRAIN_ID.
Reading ListCall notion-search with:
{"query": "Reading List", "query_type": "internal"}
If a database (not a page) named exactly Reading List exists:
SECOND_BRAIN_ID, do nothing — record READING_LIST_ID and skip to Step 3.notion-move-pages to move it under SECOND_BRAIN_ID. Record READING_LIST_ID.If not found, call notion-create-database with:
{
"parent": {"type": "page_id", "page_id": "<SECOND_BRAIN_ID>"},
"title": [{"type": "text", "text": {"content": "Reading List"}}],
"properties": {
"Name": {"title": {}},
"Type": {"select": {"options": [
{"name": "Book"}, {"name": "Article"}, {"name": "Podcast"}, {"name": "Video"}
]}},
"Status": {"select": {"options": [
{"name": "Not started"}, {"name": "In progress"}, {"name": "Done"}
]}},
"Score": {"number": {"format": "number"}},
"Author": {"rich_text": {}},
"Link": {"url": {}},
"Review(Sum up)": {"rich_text": {}},
"Tags": {"multi_select": {"options": []}}
}
}
Record READING_LIST_ID from the response.
InboxSame pattern as Step 2. Search → adopt-and-move if exists → otherwise create with:
{
"parent": {"type": "page_id", "page_id": "<SECOND_BRAIN_ID>"},
"title": [{"type": "text", "text": {"content": "Inbox"}}],
"properties": {
"Note": {"title": {}},
"Type": {"select": {"options": [
{"name": "Thought"}, {"name": "Task"}, {"name": "Resource"}, {"name": "Reference"}
]}},
"Processed": {"checkbox": {}},
"Date": {"date": {}}
}
}
Reply to the user with exactly this format (filling URLs from tool responses):
Second Brain ready ✓
• Second Brain page: <url>
• Reading List (created|adopted|moved): <url>
• Inbox (created|adopted|moved): <url>
If captures don't work, make sure the IronClaw integration is connected to the Second Brain page (… → Connections → IronClaw). Sharing the parent cascades to children.
null for any field. Omit the field. Empty string is also wrong for most fields — omit instead.template_id or cover unless you have real values. These are the most common null-pass mistakes.YYYY-MM-DD strings only.notion-search rate limit is 30/min — do not search more than necessary. One search per database name in this skill is enough.-32602, strip every field that is not strictly required by the tool's documented schema and retry once. Do not retry the same payload.notion-create-database returns a database_id. The corresponding data_source_id (for queries later) appears in the response under the data sources array. Save both if returned.notion-create-pages to create Reading List or Inbox — they are databases, not pages. Use notion-create-database.Reading List or Inbox more than once each.