Notion Worker Third-Party Auth Guide
makenotion/workers-template
Decides whether a Notion Worker should use a brokered credential, a plaintext environment secret, or OAuth to authenticate against a non-Notion service.
Read and write Notion pages and databases using the Notion API
$ npx skills add vellum-ai/vellum-assistant --skill notion -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install vellum-ai/vellum-assistant notion --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/notion .claude/skills/notion && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "notion" agent skill from https://github.com/vellum-ai/vellum-assistant/tree/main/skills/notion into .claude/skills/notion/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notion", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/vellum-ai/vellum-assistant/tree/main/skills/notionType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add vellum-ai/vellum-assistant --skill notion -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install vellum-ai/vellum-assistant notion --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/notion .agents/skills/notion && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "notion" agent skill from https://github.com/vellum-ai/vellum-assistant/tree/main/skills/notion into .agents/skills/notion/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notion", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vellum-ai/vellum-assistant --skill notion -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install vellum-ai/vellum-assistant notion --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/notion .cursor/skills/notion && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "notion" agent skill from https://github.com/vellum-ai/vellum-assistant/tree/main/skills/notion into .cursor/skills/notion/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notion", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/vellum-ai/vellum-assistant.git --path skills/notion--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add vellum-ai/vellum-assistant --skill notion -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install vellum-ai/vellum-assistant notion --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/notion .gemini/skills/notion && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "notion" agent skill from https://github.com/vellum-ai/vellum-assistant/tree/main/skills/notion into .gemini/skills/notion/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notion", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install vellum-ai/vellum-assistant notionInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add vellum-ai/vellum-assistant --skill notion -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/notion .github/skills/notion && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "notion" agent skill from https://github.com/vellum-ai/vellum-assistant/tree/main/skills/notion into .github/skills/notion/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notion", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add vellum-ai/vellum-assistant --skill notion -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install vellum-ai/vellum-assistant notion --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vellum-ai/vellum-assistant.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/notion .opencode/skills/notion && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "notion" agent skill from https://github.com/vellum-ai/vellum-assistant/tree/main/skills/notion into .opencode/skills/notion/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "notion", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
notionRead and write Notion pages and databases using the Notion API
Notion is an agent skill from vellum-ai/vellum-assistant. Read and write Notion pages and databases using the Notion API
Its SKILL.md is about 2.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including assets. Compatibility notes: Designed for Vellum personal assistants
It sits in Backend & APIs. It works with Notion. The repository describes itself as: An AI Assistant that’s easy to setup, does your work 24/7, knows your preferences and gets better over time. The licence is MIT.
Read from SKILL.md and the folder at commit 33cc983. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.notion.comnotion.soFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Designed for Vellum personal assistants
From compatibility in the SKILL.md frontmatter.
Notion loads about 2.7k tokens when it runs. Until then it costs about 17 tokens; SKILL.md has 896 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from vellum-ai/vellum-assistant at commit 33cc983, republished under its MIT licence (© vellum-ai). 896 words, ~2,723 tokens.
.claude/skills/notion/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.You have access to the Notion API via the managed OAuth connection or an internal integration secret stored in the credential vault. Both paths inject the Authorization header automatically. Never reveal credential values or echo token values into the shell.
Step 1 - Determine connection type:
assistant credentials listLook at the results to decide which path to use:
service: "notion" entry is needed in the vault. The OAuth connection is managed by the platform. Use Path A below.service: "notion" and field: "internal_secret" is present. Use Path A below (recommended) or Path B if the credential has the required metadata (see Path B for details).Step 2 - Make authenticated API calls:
Choose the path that matches what you found in Step 1.
Use assistant oauth request --provider notion. The Authorization header is injected automatically; do not supply it manually.
assistant oauth request --provider notion \
-X POST \
-H "Notion-Version: 2022-06-28" \
-H "Content-Type: application/json" \
-d '{}' \
https://api.notion.com/v1/searchGeneral shape: assistant oauth request --provider notion -X <METHOD> -H "Notion-Version: 2022-06-28" [-H "Content-Type: application/json"] [-d '<json-body>'] <url>
https://api.notion.com/v1/pages/...) or relative (/v1/pages/...).-d accepts inline JSON, @filename, or @- for stdin.Note: The standard Notion setup flow (
vellum-oauth-integrations) does not currently produce credentials with the metadata required by this path. Most users should use Path A instead. Path B is documented for credentials that have been manually configured with the required metadata.
For internal integration secrets registered with allowedTools: ["bash"] and an injection_templates entry for api.notion.com. The proxy adds Authorization: Bearer <token> automatically. Do not include an Authorization header in the curl command.
bash:
network_mode: proxied
credential_ids: ["<credential_id_from_step_1>"]
command: |
curl -s -X POST https://api.notion.com/v1/search \
-H "Notion-Version: 2022-06-28" \
-H "Content-Type: application/json" \
-d '{}'Where <credential_id_from_step_1> is the id field from the matching entry in assistant credentials list output.
The credential MUST have:
allowedTools including "bash" (otherwise the proxy blocks the call).injection_templates with host pattern api.notion.com and header injection type for Authorization.If these are missing, you will get a credential tool policy denied error. Switch to Path A instead.
All Notion API calls go to https://api.notion.com/v1/. Always include the Notion-Version: 2022-06-28 header.
GET https://api.notion.com/v1/pages/{page_id}Returns page properties. Use the page ID from a Notion URL - the last segment of the URL, e.g. for https://notion.so/My-Page-abc123def456 the ID is abc123def456 (formatted as UUID: abc123de-f456-...).
GET https://api.notion.com/v1/blocks/{block_id}/children?page_size=100Pages are blocks too - use the page ID as the block_id. Iterates through the page's child blocks. Use start_cursor for pagination when has_more is true.
Block types and how to render them:
paragraph: Read paragraph.rich_text[].plain_textheading_1, heading_2, heading_3: Read heading_N.rich_text[].plain_textbulleted_list_item, numbered_list_item: Read *.rich_text[].plain_textto_do: Read to_do.rich_text[].plain_text and to_do.checkedtoggle: Read toggle.rich_text[].plain_text; children are nested blockscode: Read code.rich_text[].plain_text and code.languagequote: Read quote.rich_text[].plain_textcallout: Read callout.rich_text[].plain_textdivider: Render as ---image: Read image.external.url or image.file.urlchild_page: Read child_page.title; use its id to recursively fetch if neededPOST https://api.notion.com/v1/search
{
"query": "your search term",
"filter": { "value": "page", "property": "object" },
"sort": { "direction": "descending", "timestamp": "last_edited_time" },
"page_size": 10
}Omit filter to search both pages and databases. Use filter.value: "database" to search only databases.
Returns results[] with id, url, properties.title (for pages), and title[] (for databases).
GET https://api.notion.com/v1/databases/{database_id}Returns the database schema (all property definitions).
POST https://api.notion.com/v1/databases/{database_id}/query
{
"filter": {
"property": "Status",
"select": { "equals": "In Progress" }
},
"sorts": [
{ "property": "Created", "direction": "descending" }
],
"page_size": 20
}Omit filter to retrieve all rows. Returns results[] where each item is a page (database row).
Extracting property values from database rows:
title: properties.Name.title[].plain_textrich_text: properties.Notes.rich_text[].plain_textnumber: properties.Price.numberselect: properties.Status.select.namemulti_select: properties.Tags.multi_select[].namedate: properties.Due.date.start (ISO 8601)checkbox: properties.Done.checkboxurl: properties.Link.urlemail: properties.Email.emailpeople: properties.Owner.people[].namerelation: properties.Projects.relation[].id (array of page IDs)POST https://api.notion.com/v1/pages
{
"parent": { "page_id": "<parent_page_id>" },
"properties": {
"title": {
"title": [{ "text": { "content": "My New Page" } }]
}
},
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{ "text": { "content": "Page content here." } }]
}
}
]
}For database rows, use "parent": { "database_id": "<database_id>" } and include the database's required properties.
PATCH https://api.notion.com/v1/pages/{page_id}
{
"properties": {
"Status": { "select": { "name": "Done" } },
"Due": { "date": { "start": "2024-12-31" } }
}
}PATCH https://api.notion.com/v1/blocks/{block_id}/children
{
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {
"rich_text": [{ "text": { "content": "Appended content." } }]
}
},
{
"object": "block",
"type": "heading_2",
"heading_2": {
"rich_text": [{ "text": { "content": "A heading" } }]
}
},
{
"object": "block",
"type": "bulleted_list_item",
"bulleted_list_item": {
"rich_text": [{ "text": { "content": "A bullet point" } }]
}
},
{
"object": "block",
"type": "to_do",
"to_do": {
"rich_text": [{ "text": { "content": "A task" } }],
"checked": false
}
}
]
}PATCH https://api.notion.com/v1/blocks/{block_id}
{
"paragraph": {
"rich_text": [{ "text": { "content": "Updated text." } }]
}
}DELETE https://api.notion.com/v1/blocks/{block_id}Notion does not permanently delete pages via the API - it archives them:
PATCH https://api.notion.com/v1/pages/{page_id}
{
"archived": true
}When a response includes "has_more": true, pass "start_cursor": response.next_cursor in the next request to get the next page of results.
message field with details.credential tool policy denied: The credential is missing bash in allowedTools or an injection_templates entry for api.notion.com, so the proxy cannot inject the Authorization header. Switch to Path A (managed OAuth), which bypasses credential metadata requirements entirely.abc123def456... or abc123de-f456-....Notion-Version: 2022-06-28 header to get stable API behavior.plain_text values in the array to get the full text content.annotations and href fields in rich_text objects.© vellum-ai, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (assets) in skills/notion of vellum-ai/vellum-assistant.
Open the folder on GitHubat commit 33cc983
Notion next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Notion this skillvellum-ai/vellum-assistant | 1.4k | — | ~2.7k | Automated safety check: Pass | MIT | |
| Notion Worker Third-Party Auth Guidemakenotion/workers-template | 439 | 1 repos | ~3.5k | Automated safety check: Notes | MIT | |
| Add OAuth Providersuperdesigndev/treg | 5k | — | ~2.5k | Automated safety check: Pass | Custom licence | |
| Notion Worker Sync Scaffoldmakenotion/workers-template | 439 | 1 repos | ~4.6k | Automated safety check: Notes | MIT | |
| Notion Workers Sync Guidemakenotion/workers-template | 439 | 1 repos | ~3k | Automated safety check: Pass | MIT | |
| Notion APIintellectronica/agent-skills | 295 | 1 repos | ~3.7k | Automated safety check: Pass | CC0-1.0 |
makenotion/workers-template
Decides whether a Notion Worker should use a brokered credential, a plaintext environment secret, or OAuth to authenticate against a non-Notion service.
superdesigndev/treg
Add a provider to treg's OAuth registry (the ones treg holds its own approved app for).
makenotion/workers-template
Walks you through designing a new sync for a Notion Worker, covering data source, mode, pagination and cursors, and then generates working code.
makenotion/workers-template
Guides the design of Notion Workers syncs, from choosing a simple replace sync or a backfill plus delta pair to pagination, consistency buffers, pacing and deletion handling.
intellectronica/agent-skills
This skill provides comprehensive instructions for interacting with the Notion API via REST calls.
holon-run/uxc
Operate Notion Public API through UXC with a curated OpenAPI schema for search, block traversal, page reads, content writes, and data source/database inspection.
vellum-ai/vellum-assistant
Create and configure a GitHub App so the assistant can push commits, open PRs, and comment under its own bot identity.
vellum-ai/vellum-assistant
Connect a Discord bot to the assistant via the Discord Gateway with guided application creation and intent configuration
vellum-ai/vellum-assistant
Create and configure a Sentry internal integration so the assistant can manage issues, alerts, and releases under its own identity
vellum-ai/vellum-assistant
Ingest a large dataset into memory as a skimmed map. An agent skill from vellum-ai/vellum-assistant.
vellum-ai/vellum-assistant
A skill your agent uses when the user wants to build, scaffold, ship, or edit a Vellum plugin that bundles multiple surfaces (hooks, tools, skills, and more) into one installable package.
vellum-ai/vellum-assistant
Connect a Slack app to the Vellum Assistant via Socket Mode.
Works with
Categories
Read and write Notion pages and databases using the Notion API. Notion is an agent skill from vellum-ai/vellum-assistant.
Notion fits situations like: backend & APIs work in your project.
Run `npx skills add vellum-ai/vellum-assistant --skill notion -a claude-code`. Or copy the skill folder (skills/notion in vellum-ai/vellum-assistant) into .claude/skills/notion in your project. Claude Code loads it when a task matches its description.
Run `npx skills add vellum-ai/vellum-assistant --skill notion -a codex`. Or copy the skill folder (skills/notion in vellum-ai/vellum-assistant) into .agents/skills/notion in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add vellum-ai/vellum-assistant --skill notion -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/notion, .gemini/skills/notion, .github/skills/notion and .opencode/skills/notion in your project.
Going by SKILL.md and its folder, Notion needs the command-line tools its instructions call (curl). Compatibility (from SKILL.md): Designed for Vellum personal assistants.
SKILL.md names 2 domains. In commands or code: api.notion.com and notion.so; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Notion is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.7k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Notion: Notion Worker Third-Party Auth Guide (makenotion/workers-template, 439 stars), Add OAuth Provider (superdesigndev/treg, 5k stars), Notion Worker Sync Scaffold (makenotion/workers-template, 439 stars) and Notion Workers Sync Guide (makenotion/workers-template, 439 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
vellum-ai (a GitHub organization) maintains it in vellum-ai/vellum-assistant, which has 1,408 GitHub stars. The repository holds 108 skills in this directory. The repository was last updated on October 9, 2026.
Source: vellum-ai/vellum-assistant on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.