# Notion Skills Bundle
This file combines the current contents of:
- `notion-init/SKILL.md`
- `notion-install/SKILL.md`
- `notion-update/SKILL.md`
- `notion-check-updates/SKILL.md`
Make sure you will create folder with {skill-name} and then inside of it create SKILL.md file with contents of skill.
---
---
name: notion-init
description: |
Initializes a project-local Notion skill registry for OpenCode or Claude-style
repos. Use when the current repository wants to install Notion-hosted skills
into `.opencode/skills/{skill-name}/SKILL.md` or `.claude/skills/{skill-name}/SKILL.md`
and track them in a local manifest.
version: 1.0.0
user-invocable: true
allowed-tools:
- Read
- Write
- Edit
- Bash
- Grep
- Glob
- AskUserQuestion
metadata:
author: niko
category: notion-registry
---
# Notion Init
Initialize the local Notion-backed skill registry for the current project.
## Goal
Set up a project-local manifest that will later be used to install generated wrapper skills into:
- `.opencode/skills/{skill-name}/SKILL.md`
- `.claude/skills/{skill-name}/SKILL.md`
The manifest file should live in the same local config root:
- `.opencode/notion-skills.json`
- `.claude/notion-skills.json`
## Important scope rule
Do not write to global config folders like:
- `~/.config/opencode`
- `~/.config/claude`
Only work inside the current repository.
## Detection rules
1. Check whether `.opencode/` exists in the current project root.
2. Check whether `.claude/` exists in the current project root.
Choose target root like this:
- If `.opencode/` exists and `.claude/` does not, use `.opencode/`
- If `.claude/` exists and `.opencode/` does not, use `.claude/`
- If both exist, ask the user which one to initialize
- If neither exists, ask the user which one to create
- Default to `.opencode/` if the user has no preference
## What to create
Inside the chosen root, ensure these paths exist:
- `{root}/skills/`
- `{root}/notion-skills.json`
Where `{root}` is either `.opencode` or `.claude`.
## Manifest format
Create or repair the manifest using exactly this shape:
```json
{
"registryVersion": 1,
"provider": "notion",
"root": ".opencode",
"notion": {
"mcpServer": "notion",
"skillRegistryPageId": "REPLACE_ME"
},
"skills": {}
}
If the root is .claude, then "root" should be ".claude".
This manifest must store the Notion page ID for the skill registry index page.
The registry is a regular Notion page, not a database. It contains grouped skill version links like:
Content Creator
content-creator@v1 - approvedcontent-creator@v2 - approvedDigest writer
digest-writer@v1 - approvedIf a manifest already exists:
notion.skillRegistryPageId if presentIf it is missing:
Ask the user:
Please provide the Notion Skill Registry page ID or full Notion URL.
Then normalize it:
If parsing fails, ask once more clearly.
Read it first and preserve any installed skills.
Repair rules:
registryVersion is missing, set it to 1provider is missing, set it to "notion"root is missing, set it to the chosen local rootnotion is missing, create itnotion.mcpServer is missing, set it to "notion"notion.skillRegistryPageId is missing, ask the user and set itnotion.skillVersionsDataSourceId exists, migrate its value into notion.skillRegistryPageId and remove the legacy fieldskills is missing, set it to {}Do not delete or rewrite existing skill records unnecessarily.
If {root}/notion-skills.json already exists:
{root}/notion-skills.json.bakThis file tracks which remote Notion skills are installed locally into:
{root}/skills/{skill-name}/SKILL.mdLater commands like notion-install, notion-update, and notion-check-updates will use it.
~/.config/opencode.opencode/ and .claude/ in the current repo.{root}/skills/ exists.{root}/notion-skills.json if it exists.At the end, report:
.opencode or .claude){
"registryVersion": 1,
"provider": "notion",
"root": ".opencode",
"notion": {
"mcpServer": "notion",
"skillRegistryPageId": "31f186f0c3d98061bd19d38cba879b4b"
},
"skills": {}
}
{
"registryVersion": 1,
"provider": "notion",
"root": ".claude",
"notion": {
"mcpServer": "notion",
"skillRegistryPageId": "31f186f0c3d98061bd19d38cba879b4b"
},
"skills": {}
}
name: notion-install
description: |
Installs a project-local wrapper skill from the Notion skill registry into
.opencode/skills/{skill-name}/SKILL.md or .claude/skills/{skill-name}/SKILL.md.
Use when a repository wants to consume a Notion-hosted skill without copying
the full skill text manually.
version: 1.0.0
user-invocable: true
allowed-tools:
Install one skill from the Notion skill registry into the current project. Make sure to always check if Skill page has any subpages/children and to install/copy all of them inside the skill directory.
Create a local wrapper skill at one of these paths:
.opencode/skills/{slug}/SKILL.md.claude/skills/{slug}/SKILL.mdand record it in the local manifest:
.opencode/notion-skills.json.claude/notion-skills.json~/.config/opencode or any global config.notion-init..opencode/ and .claude/ in the current repo..opencode/notion-skills.json.claude/notion-skills.jsonnotion-init first.Determine the skill name from the user request.
If the skill name is not explicit, ask:
Which skill slug should I install from Notion?
Optionally detect an explicit version from the request.
Install latest-approved.
Install that exact version.
Use the Notion MCP server referenced by the local manifest under:
notion.mcpServerFetch the Notion skill registry page identified by:
notion.skillRegistryPageIdThis registry is a regular page, not a database. It contains linked version pages grouped by skill, for example:
Content Creator
content-creator@v1 - approvedcontent-creator@v2 - approvedUse Notion MCP tools to:
If an exact version was requested, such as content-creator@v2:
If only a slug was requested, such as content-creator:
content-creator@v*approved in the surrounding text on the registry pageIf the registry page does not expose enough detail to resolve the target skill cleanly:
content-creator@v2Create a local SKILL.md with frontmatter and instructions that load the exact Notion page.
---
name: content-creator
version: v2
description: |
Wrapper for the remote Notion-hosted `content-creator` skill.
metadata:
author: niko
installed_from: notion
installed_version: "v2"
tracking: "latest-approved"
source_page_id: "31f186f0c3d98061bd19d38cba879b4b"
allowed-tools:
- Read
- Write
- Edit
- Bash
- Grep
- Glob
- AskUserQuestion
---
# Content Creator
Load and apply this exact remote skill from Notion MCP:
- Page id: `31f186f0c3d98061bd19d38cba879b4b`
## Steps
1. Retrieve the exact Notion page.
2. Retrieve page/block children recursively until the whole page is loaded.
3. Use that page content as the active skill instructions for this session.
4. Do not search unrelated Notion pages.
5. Immediately follow the remote skill instructions.
When installing, record one of these tracking modes in the manifest:
latest-approved if no exact version was requestedpinned if a specific version was requestedAfter generating the wrapper, update the local manifest under skills[slug].
Store at least:
{
"slug": "security-baseline",
"installedVersion": "v2",
"tracking": "latest-approved",
"pageId": "31f186f0c3d98061bd19d38cba879b4b",
"localSkillPath": ".opencode/skills/security-baseline/SKILL.md",
"updatedAt": "ISO_TIMESTAMP"
}
SKILL.md to SKILL.md.bak before overwriting.opencode and .claude at onceAt the end, report:
name: notion-check-updates description: | Checks whether project-local Notion-backed wrapper skills are outdated without modifying any files. Use when you want to compare installed versions against the Notion registry page. version: 1.0.0 user-invocable: true allowed-tools:
Check for newer versions of installed Notion-backed skills without changing local files.
Inspect the local manifest and report whether each tracked skill is:
.opencode/notion-skills.json and .claude/notion-skills.json.notion-init first.This command can run with or without a skill name.
For each selected skill:
skillRegistryPageId.slug.installedVersion.slug@vNapproved on the registry pageup to datelatest-approved:
update availablepinned:
newer version exists, but skill is pinnedmissing from registryGroup results under:
Up to dateUpdate availablePinned with newer version availableMissing from registryFor each skill, include:
name: notion-update description: | Updates installed project-local Notion-backed wrapper skills by checking the configured registry page and refreshing local wrappers when needed. version: 1.0.0 user-invocable: true allowed-tools:
Update installed project-local Notion-backed wrapper skills.
Refresh generated wrapper skills under:
.opencode/skills/{skill-name}/SKILL.md.claude/skills/{skill-name}/SKILL.mdbased on the local manifest.
.opencode/notion-skills.json and .claude/notion-skills.json.notion-init first.This command can run with or without a skill name.
Read each manifest entry under skills.
Expected fields include:
sluginstalledVersiontrackingpageIdlocalSkillPathtracking = latest-approvedinstalledVersion, regenerate the wrappertracking = pinnedUse the Notion MCP server and registry page from the local manifest.
For each skill:
skillRegistryPageIdslug@vNapproved on the registry page when resolving latest-approvedRebuild the local SKILL.md in the same style as notion-install.
Before overwriting an existing file:
SKILL.md.bakFor each updated skill:
installedVersion to the new versionpageId if changedupdatedAttrackingAt the end, report three groups:
For each updated skill, include old version and new version.
Register these skills, so I can use them globally. You don't need Skill Registry Page ID for this. Register them as per normal workflow you already know.