Install
$ agentstack add skill-gregthegreek-claude-obsidian-notion ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Notion
Unified skill for all Notion operations with intelligent routing and safety confirmations.
When to Use
- User says
/notionor/notion - User asks to search, read, create, update, or upload to Notion
- User provides a Notion URL
- User wants to manage Notion databases
Subcommands
/notion # Interactive - asks what to do
/notion search # Search pages/databases
/notion read # Fetch and display page content
/notion create # Create new page
/notion update # Update existing page
/notion upload [file] # Upload file content to Notion
/notion db create # Create new database
/notion db update # Update database schema
Pre-flight: MCP Connection Check
Before executing any Notion operation, verify MCP connectivity:
- Implicit check: The first MCP tool call serves as the connection test
- On failure: Immediately trigger the MCP re-authorization flow (see Error Handling)
- On success: Continue with the requested workflow
If a tool call fails mid-workflow, do not continue - trigger re-auth flow and offer to retry from the beginning.
Routing Logic
Evaluate in this order:
- Explicit subcommand -
/notion search Xroutes to SEARCH workflow - Argument patterns:
- Notion URL or UUID -> READ workflow
- Local file path (.md, .txt) -> UPLOAD workflow
- Natural language:
- "search/find in Notion" -> SEARCH
- "show me/what's in" -> READ
- "put this in/upload to Notion" -> UPLOAD
- "create a page/new page" -> CREATE
- "update/edit/change the" -> UPDATE
- "delete/trash" -> UPDATE (with trash)
Priority when patterns overlap:
- Explicit subcommand takes highest priority
- URLs/IDs take priority over natural language
- Fall through to "Ambiguous" when truly unclear
- Ambiguous - Ask user:
``` What would you like to do in Notion?
- Search for something
- Read a page
- Create a new page
- Update an existing page
- Upload a file
```
Workflows
SEARCH (no confirmation needed)
Trigger: /notion search or "search Notion for..."
Steps:
- Execute
notion-searchwith query - Display results:
NOTION SEARCH: ""
---
Found X results:
Pages:
1. [Page Title] - Team/Location - modified YYYY-MM-DD
2. [Page Title] - Team/Location - modified YYYY-MM-DD
Databases:
3. [Database Title] - Team/Location - X entries
---
Enter number to read, or "create" to make a new page
READ (no confirmation needed)
Trigger: /notion read or Notion URL provided
Steps:
- Parse URL/ID from input
- Execute
notion-fetchwith ID - Display content:
NOTION PAGE: [Title]
---
Location: [Team] > [Parent Page]
Type: Page | Database entry
Last edited: YYYY-MM-DD
---
[Content - first 20-30 lines]
---
[If long: "Showing first 30 lines of ~200"]
Enter "more" to continue, "update" to modify, or "copy" to duplicate
CREATE (confirmation required)
Trigger: /notion create or "create a page in Notion"
Step 1 - Content:
What content should the new page have?
1. I'll write it now (enter content)
2. Generate from topic (describe what you want)
3. Empty page (just title)
Step 2 - Destination Discovery: Use notion-search for related pages and notion-get-teams for teams:
Where should this page be created?
[Team Name]:
1. [Related page]
2. [Database - add as entry]
[Another Team]:
3. [Related page]
4. Create as standalone page
5. Other (paste URL or describe)
Step 3 - Preview:
NOTION CREATE PREVIEW
---
Target: [Destination] in [Team]
Title: [Page title]
Type: Page | Database entry
Length: ~X words
---
Content preview:
[First 5-10 lines]
---
Proceed? (yes/no/edit)
Step 4: On "yes", execute notion-create-pages and return URL.
UPDATE (confirmation required)
Trigger: /notion update or "update/edit the..."
Step 1 - Fetch and show current state:
NOTION PAGE: [Title]
---
Location: [Team] > [Parent]
Properties: [if database entry]
---
Current content:
[First 20 lines]
---
What would you like to change?
1. Update properties (title, status, etc.)
2. Replace content
3. Append content
4. Move to trash
Step 2 - Preview:
NOTION UPDATE PREVIEW
---
Page: [Title] in [Team]
Change type: [Properties | Content | Both | Trash]
---
CHANGES:
[For properties: old -> new]
[For content: replacement preview or diff]
---
Proceed? (yes/no/edit)
Step 3: On "yes", execute notion-update-page and return URL.
For trash requests:
NOTION TRASH PREVIEW
---
Page: [Title]
Location: [Team] > [Parent]
---
This will move the page to trash (recoverable in Notion for 30 days).
Proceed? (yes/no)
Use notion-update-page with properties to move to trash (soft delete only).
UPLOAD (confirmation required)
Trigger: /notion upload [file] or "put this in Notion"
Preserves the existing notion-upload workflow:
Step 1 - Identify Content:
- If file path provided: read that file
- If no path: ask "What would you like to upload to Notion?"
- Accept: file path, "current document", or pasted content
Step 2 - Format Selection:
How would you like this uploaded?
1. Summary (3-5 bullet points)
2. Full document (preserves structure)
Step 3 - Destination Discovery: Use notion-search and notion-get-teams:
Where should this go?
[Team Name]:
1. [Related page name]
2. [Another related page]
[Another Team]:
3. [Related page]
4. Create new page (specify location)
5. Other (paste URL or describe)
Step 4 - Preview:
NOTION UPLOAD PREVIEW
---
Target: [Selected destination]
Format: [Summary | Full document]
Length: ~X words, Y sections
Sections: [heading list]
---
Preview:
[First 5-10 lines only]
---
Proceed? (yes/no/edit)
Step 5: On "yes", execute notion-create-pages and return URL.
DATABASE CREATE (extra confirmation - type "confirm")
Trigger: /notion db create or "create a database in Notion"
Step 1 - Gather schema:
What database would you like to create?
Please describe:
1. Database name/title
2. Properties needed (columns)
- e.g., "Status (select: To Do, In Progress, Done)"
- e.g., "Due Date (date)"
- e.g., "Assignee (people)"
3. Purpose (helps suggest properties)
Step 2 - Destination Discovery: Same tree view as CREATE workflow.
Step 3 - Preview:
DATABASE CREATE PREVIEW
---
Name: [Database Title]
Location: [Team] > [Parent Page]
---
Schema:
| Property | Type | Options |
|----------|------|---------|
| Name | title | - |
| Status | select | To Do, In Progress, Done |
| Due Date | date | - |
---
Creating a database is a significant action.
Type "confirm" to proceed, or "edit" to modify.
Step 4: On "confirm", execute notion-create-database and return URL.
DATABASE UPDATE (extra confirmation - type "confirm")
Trigger: /notion db update or "update database schema"
Step 1 - Fetch and show current schema:
DATABASE: [Title]
---
Location: [Team] > [Parent]
Entries: X pages
---
Current schema:
| Property | Type | Options |
|----------|------|---------|
| Name | title | - |
| Status | select | To Do, In Progress, Done |
...
What would you like to change?
1. Add property
2. Rename property
3. Remove property
4. Update select/multi-select options
5. Move to trash
Step 2 - Preview:
DATABASE UPDATE PREVIEW
---
Database: [Title] in [Team]
Entries affected: X pages
---
CHANGES:
- ADD: "Priority" (select: High, Medium, Low)
- RENAME: "Status" -> "Project Status"
- REMOVE: "Old Field" (data will be lost!)
---
Modifying a database schema affects all X entries.
Type "confirm" to proceed, or "edit" to modify.
Step 3: On "confirm", execute notion-update-database and return URL.
For trash requests:
DATABASE TRASH PREVIEW
---
Database: [Title]
Location: [Team] > [Parent]
Contains: X entries
---
This will move the database and all entries to trash (recoverable for 30 days).
Type "confirm" to proceed.
Safety Rules
All Write Operations Require Confirmation
- Pages: Standard "Proceed? (yes/no/edit)" confirmation
- Databases: Extra confirmation - must type "confirm"
Never Permanently Delete
- All deletions use soft delete (move to trash)
- Always mention content is recoverable in Notion for 30 days
- Never use permanent deletion
Preview Requirements
- Never show raw markdown dumps in previews
- Max 10 lines of content preview
- Always show target location, action type, and scope
- For databases, always show affected entry count
Destination Discovery Pattern
When creating or uploading, always:
- Search for related pages using
notion-search - Get teams using
notion-get-teams - Present tree view with numbered options
- Include "standalone" and "other" options
Error Handling
MCP Connection Failures
When any Notion MCP tool call fails with connection errors, timeout, or authorization issues:
Detection triggers:
- "MCP server not connected"
- "Connection refused"
- "Authorization failed"
- "Token expired"
- "MCP tool failed"
- Tool returns empty/null when it shouldn't
- Timeout errors
Automatic re-authorization flow:
- Detect and inform:
NOTION CONNECTION ISSUE
---
The Notion MCP server isn't responding. This usually means:
- The OAuth token has expired
- The MCP server needs to be restarted
- Authorization was revoked
Let me help you reconnect.
- Prompt for re-authorization:
To reconnect to Notion:
1. Run: /mcp
2. Find "notion" in the server list
3. Select "Restart" or "Reconnect"
4. If prompted, re-authorize in browser
Once done, say "ready" and I'll retry your request.
- Retry logic:
- After user confirms ready, retry the original operation
- If still failing after re-auth attempt, escalate:
Still unable to connect. Try these steps:
1. Check MCP server status: /mcp
2. Remove and re-add the Notion integration:
- Remove: mcp remove notion
- Re-add: mcp add notion
3. Verify OAuth in Notion settings: https://www.notion.so/my-integrations
Let me know when you've tried these steps.
Standard Errors
Page not found:
"Could not find that page. It may have been deleted or you may not have access.
Try: /notion search [keywords]"
Permission denied:
"You don't have permission to [action] this [page|database].
The page may be in a restricted teamspace."
Invalid URL/ID:
"That doesn't look like a valid Notion URL or page ID.
Expected format: https://notion.so/... or a UUID"
Search returned nothing:
"No results found for '[query]'.
Try broader search terms, or /notion create to make a new page"
Guidelines
- Default to asking questions when intent is unclear
- Read operations (search, read) need no confirmation
- Write operations always need confirmation preview
- Database operations need extra confirmation (type "confirm")
- Use consistent formatting across all previews
- Always return Notion URL after successful writes
- For summaries: generate concise bullet points, not walls of text
- For full documents: preserve original headers and structure
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: GregTheGreek
- Source: GregTheGreek/claude-obsidian
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.