One-shot Notion workspace scaffolder for the second-brain skill. Creates or adopts the "Second Brain" parent page and its child databases (Reading List, Inbo...
---
name: second-brain-setup
version: 0.4.0
description: One-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.
activation:
keywords:
- set up my second brain
- setup my second brain
- initialize notion
- scaffold notion
- bootstrap notion
- second brain setup
- repair second brain
- fix second brain
patterns:
- "set ?up (my )?second brain"
- "(initialize|scaffold|bootstrap) (my )?(notion|second brain)"
- "(repair|fix|reset) (my )?second brain"
tags:
- notion
- second-brain
- setup
- onboarding
exclude_keywords:
- dry-run
max_context_tokens: 3000
---
# Second Brain Setup
## STRICT RULES — read first
You 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:**
1. One **page** titled exactly `Second Brain` (no body content, no icon, no cover)
2. One **database** titled exactly `Reading List` as a child of that page
3. One **database** titled exactly `Inbox` as a child of that page
❌ **Forbidden — even if your training suggests them:**
- ❌ PARA pages (Projects / Areas / Resources / Archives)
- ❌ "Building a Second Brain" overview, methodology, or wiki content
- ❌ "Book Notes", "Meeting Notes", "Daily Notes", "Quick Links"
- ❌ Any markdown body content on the `Second Brain` parent page
- ❌ Calling `notion-create-pages` to create something that should be a database
- ❌ Adding emojis, covers, or decorative properties anywhere
If 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.
## Tool sequence
Execute in order. Stop and report on first hard failure.
### Step 0 — Find an accessible parent page (PREREQUISITE)
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:
```json
{"query": "", "query_type": "internal"}
```
This returns every page the integration can see. From the results:
- If you see a page already titled exactly `Second Brain`, save its `page_id` as `SECOND_BRAIN_ID` and skip to Step 2.
- Otherwise, pick any visible page as `INTEGRATION_PARENT_ID`. Prefer one that looks like a top-level workspace page (no parent, or named like `Home`, `Workspace`, `IronClaw`, etc.).
- If the search returns zero results, STOP and reply to the user with exactly:
> `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.`
### Step 1 — Create the `Second Brain` parent page
Only run this step if `SECOND_BRAIN_ID` was not found in Step 0.
Call `notion-create-pages` with **exactly this payload — no other fields**:
```json
{
"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`.
### Step 2 — Find or adopt `Reading List`
Call `notion-search` with:
```json
{"query": "Reading List", "query_type": "internal"}
```
If a database (not a page) named exactly `Reading List` exists:
- If its parent is already `SECOND_BRAIN_ID`, do nothing — record `READING_LIST_ID` and skip to Step 3.
- If its parent is something else, call `notion-move-pages` to move it under `SECOND_BRAIN_ID`. Record `READING_LIST_ID`.
- Do NOT modify its existing schema, even if it differs from the spec below. Adopt as-is.
If not found, call `notion-create-database` with:
```json
{
"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.
### Step 3 — Find or adopt `Inbox`
Same pattern as Step 2. Search → adopt-and-move if exists → otherwise create with:
```json
{
"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": {}}
}
}
```
### Step 4 — Report
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.
```
## MCP call rules
- **Never pass `null` for any field.** Omit the field. Empty string is also wrong for most fields — omit instead.
- **Never include `template_id` or `cover`** unless you have real values. These are the most common null-pass mistakes.
- **Date fields** are `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.
- **If a tool call fails with `-32602`**, strip every field that is not strictly required by the tool's documented schema and retry once. Do not retry the same payload.
- **Database vs data source:** `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.
## What not to do
- Do not call `notion-create-pages` to create `Reading List` or `Inbox` — they are databases, not pages. Use `notion-create-database`.
- Do not write any explanatory or methodological content into Notion. The user already knows what a second brain is.
- Do not search for `Reading List` or `Inbox` more than once each.
- Do not delete, rename, or restructure existing data. Only add what's missing.
- Do not run any captures during setup. Stop after Step 4's report.
don't have the plugin yet? install it then click "run inline in claude" again.
formalized all six implexa components, extracted decision points from original conditionals, documented all edge cases (no accessible pages, auth expiry, network timeout, rate limits, schema drift), added explicit inputs including mcp tools and integration setup, clarified output contract with schema details, added outcome signals for verification.
this skill scaffolds a notion second brain workspace in one shot. it creates a Second Brain parent page with two child databases, Reading List and Inbox, using only notion mcp tools. run this once to bootstrap your second brain, or run it again to repair a broken setup (missing databases, wrong parent, etc.). the skill is strict: it creates only those three objects, no methodology pages, no emojis, no body content. if a database already exists under the right parent, the skill adopts it as-is without modifying schema.
IronClaw) with read-write access to at least one notion page. set this up in your notion workspace: create a page, open its share menu (three dots), select "Connections", add the integration by name, and grant access. the integration must be shared with a top-level or accessible workspace page before you run this skill.Second Brain, Reading List, and Inbox objects. requires query and query_type ("internal" only).Second Brain parent page. requires parent (page_id) and properties (title only).Reading List and Inbox databases. requires parent (page_id), title, and properties (schema).Reading List or Inbox exist but have the wrong parent. requires page_ids array and parent (page_id).Second Brain, one for Reading List, one for Inbox), so rate limits are not a concern.step 0 - prerequisite: find an accessible parent page
the notion integration can only create child pages under a page it has already been shared with. there is no workspace root creation path.
call notion-search with payload:
{"query": "", "query_type": "internal"}
examine the results:
Second Brain, save its page_id as SECOND_BRAIN_ID and jump to step 2 (database adoption).INTEGRATION_PARENT_ID. prefer a top-level page (no parent, or with a name 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.input: notion search with empty query.
output: list of pages. saves SECOND_BRAIN_ID or INTEGRATION_PARENT_ID.
step 1 - create the second brain parent page (conditional)
only run this step if SECOND_BRAIN_ID was not found in step 0.
call notion-create-pages with exactly this payload:
{
"pages": [
{
"parent": {"type": "page_id", "page_id": "<INTEGRATION_PARENT_ID>"},
"properties": {"title": "Second Brain"}
}
]
}
do not include any other fields, even empty ones: no content, icon, cover, template_id, children, tags, or description. the pages[0] object must have exactly two keys.
input: INTEGRATION_PARENT_ID from step 0.
output: SECOND_BRAIN_ID (the page_id of the created page), and SECOND_BRAIN_URL (the public url).
step 2 - find or adopt reading list database
call notion-search with:
{"query": "Reading List", "query_type": "internal"}
branch on the result:
SECOND_BRAIN_ID: do nothing. record READING_LIST_ID and READING_LIST_URL. move to step 3.notion-move-pages with page_ids: [<READING_LIST_ID>] and parent: {type: "page_id", page_id: "<SECOND_BRAIN_ID>"}. record the returned READING_LIST_ID and READING_LIST_URL. move to step 3.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 and READING_LIST_URL. move to step 3.
input: SECOND_BRAIN_ID from step 1 or step 0.
output: READING_LIST_ID, READING_LIST_URL, and action taken (created/adopted/moved).
step 3 - find or adopt inbox database
call notion-search with:
{"query": "Inbox", "query_type": "internal"}
branch identically to step 2:
SECOND_BRAIN_ID: record INBOX_ID and INBOX_URL. move to step 4.SECOND_BRAIN_ID. record INBOX_ID and INBOX_URL. move to step 4.notion-create-database 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": {}}
}
}
record INBOX_ID and INBOX_URL. move to step 4.
input: SECOND_BRAIN_ID from prior steps.
output: INBOX_ID, INBOX_URL, and action taken (created/adopted/moved).
step 4 - report success
reply to the user with exactly this format (substituting urls and actions):
Second Brain ready ✓
• Second Brain page: <SECOND_BRAIN_URL>
• Reading List (created|adopted|moved): <READING_LIST_URL>
• Inbox (created|adopted|moved): <INBOX_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.
input: all urls and actions from steps 1, 2, 3. output: formatted success message.
Second Brain page already exists in step 0: skip step 1 entirely. use the existing SECOND_BRAIN_ID for steps 2 and 3.Reading List exists but has wrong parent in step 2: move it. do not create a duplicate.Reading List exists with its own schema different from the spec: adopt it as-is. do not modify its properties.Inbox exists but has wrong parent in step 3: move it. do not create a duplicate.success is three notion objects, created or adopted, and confirmed in a formatted message:
INTEGRATION_PARENT_ID (from step 0), accessible at <SECOND_BRAIN_URL>.Second Brain, properties include Name (title), Type (select), Status (select), Score (number), Author (rich_text), Link (url), Review(Sum up) (rich_text), Tags (multi_select). accessible at <READING_LIST_URL>.Second Brain, properties include Note (title), Type (select), Processed (checkbox), Date (date). accessible at <INBOX_URL>.all urls are public notion sharing links.
the user knows the skill worked when:
Second Brain page.Second Brain shows two child databases: Reading List and Inbox.Reading List has the correct columns (Name, Type, Status, Score, Author, Link, Review, Tags).Inbox has the correct columns (Note, Type, Processed, Date).Second Brain page with the integration again (Connections menu), they can now use capture skills to add items to Reading List and Inbox without permission errors.if the user runs the skill a second time and all three objects already exist with correct parents, the output is "Second Brain ready ✓" with the same urls and action labels read "adopted".