atrislabs/atris/notion

Claude Code and agent skill by atrislabs/atris

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Notion integration via AtrisOS API. Search pages, read/create/update pages, query databases, manage blocks and comments. Use when user asks about Notion, pages, databases, wikis, or docs.

Install

npx vskill@latest install atrislabs/atris/notion

SKILL.md

Notion Agent

Drop this in ~/.claude/skills/notion/SKILL.md and Claude Code becomes your Notion assistant.

Bootstrap (ALWAYS Run First)

Before any Notion operation, run this bootstrap to ensure everything is set up:

bash
#!/bin/bash
set -e
# 1. Check if atris CLI is installed
if ! command -v atris &> /dev/null; then
echo "Installing atris CLI..."
npm install -g atris
fi
# 2. Check if logged in to AtrisOS
if [ ! -f ~/.atris/credentials.json ]; then
echo "Not logged in to AtrisOS."
echo ""
echo "Option 1 (interactive): Run 'atris login' and follow prompts"
echo "Option 2 (non-interactive): Get token from https://atris.ai/auth/cli"
echo " Then run: atris login --token YOUR_TOKEN"
echo ""
exit 1
fi
# 3. Extract token
if command -v node &> /dev/null; then
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")
elif command -v python3 &> /dev/null; then
TOKEN=$(python3 -c "import json,os; print(json.load(open(os.path.expanduser('~/.atris/credentials.json')))['token'])")
elif command -v jq &> /dev/null; then
TOKEN=$(jq -r '.token' ~/.atris/credentials.json)
else
echo "Error: Need node, python3, or jq to read credentials"
exit 1
fi
# 4. Check Notion connection status
STATUS=$(curl -s "https://api.atris.ai/api/integrations/notion/status" \
-H "Authorization: Bearer $TOKEN")
if echo "$STATUS" | grep -q "Token expired\|Not authenticated"; then
echo "Token expired. Please re-authenticate:"
echo " Run: atris login --force"
exit 1
fi
if command -v node &> /dev/null; then
CONNECTED=$(node -e "try{console.log(JSON.parse('$STATUS').connected||false)}catch(e){console.log(false)}")
elif command -v python3 &> /dev/null; then
CONNECTED=$(echo "$STATUS" | python3 -c "import sys,json; print(json.load(sys.stdin).get('connected', False))")
else
CONNECTED=$(echo "$STATUS" | jq -r '.connected // false')
fi
if [ "$CONNECTED" != "true" ] && [ "$CONNECTED" != "True" ]; then
echo "Notion not connected. Getting authorization URL..."
AUTH=$(curl -s -X POST "https://api.atris.ai/api/integrations/notion/start" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"return_url":"https://atris.ai/dashboard/settings"}')
if command -v node &> /dev/null; then
URL=$(node -e "try{console.log(JSON.parse('$AUTH').auth_url||'')}catch(e){console.log('')}")
elif command -v python3 &> /dev/null; then
URL=$(echo "$AUTH" | python3 -c "import sys,json; print(json.load(sys.stdin).get('auth_url', ''))")
else
URL=$(echo "$AUTH" | jq -r '.auth_url // empty')
fi
echo ""
echo "Open this URL to connect your Notion:"
echo "$URL"
echo ""
echo "After authorizing, run your command again."
exit 0
fi
echo "Ready. Notion is connected."
export ATRIS_TOKEN="$TOKEN"

API Reference

Base: https://api.atris.ai/api/integrations

All requests require: -H "Authorization: Bearer $TOKEN"

Get Token (after bootstrap)
bash
TOKEN=$(node -e "console.log(require('$HOME/.atris/credentials.json').token)")

Search

Search Pages & Databases
bash
curl -s "https://api.atris.ai/api/integrations/notion/search?q=meeting+notes&page_size=20" \
-H "Authorization: Bearer $TOKEN"

Filter by type:

bash
# Only pages
curl -s "https://api.atris.ai/api/integrations/notion/search?q=roadmap&filter_type=page" \
-H "Authorization: Bearer $TOKEN"
# Only databases
curl -s "https://api.atris.ai/api/integrations/notion/search?q=tasks&filter_type=database" \
-H "Authorization: Bearer $TOKEN"

Pages

Get a Page
bash
curl -s "https://api.atris.ai/api/integrations/notion/pages/{page_id}" \
-H "Authorization: Bearer $TOKEN"
Create a Page (under a page)
bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/pages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"parent_id": "PARENT_PAGE_ID",
"parent_type": "page_id",
"title": "Meeting Notes - Feb 14"
}'
Create a Page (in a database)
bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/pages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"parent_id": "DATABASE_ID",
"parent_type": "database_id",
"title": "New Task",
"properties": {
"Status": {"select": {"name": "In Progress"}},
"Priority": {"select": {"name": "High"}}
}
}'
Create a Page with Content
bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/pages" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"parent_id": "PARENT_PAGE_ID",
"parent_type": "page_id",
"title": "Project Brief",
"children": [
{
"object": "block",
"type": "heading_2",
"heading_2": {"rich_text": [{"type": "text", "text": {"content": "Overview"}}]}
},
{
"object": "block",
"type": "paragraph",
"paragraph": {"rich_text": [{"type": "text", "text": {"content": "This project aims to..."}}]}
},
{
"object": "block",
"type": "bulleted_list_item",
"bulleted_list_item": {"rich_text": [{"type": "text", "text": {"content": "Goal 1: Ship MVP"}}]}
}
]
}'
Update a Page
bash
curl -s -X PATCH "https://api.atris.ai/api/integrations/notion/pages/{page_id}" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"properties": {
"Status": {"select": {"name": "Done"}}
}
}'
Archive a Page
bash
curl -s -X PATCH "https://api.atris.ai/api/integrations/notion/pages/{page_id}" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"archived": true}'

Databases

Get Database Schema
bash
curl -s "https://api.atris.ai/api/integrations/notion/databases/{database_id}" \
-H "Authorization: Bearer $TOKEN"
Query a Database
bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/databases/{database_id}/query" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"page_size": 20}'

With filters:

bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/databases/{database_id}/query" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"filter": {
"property": "Status",
"select": {"equals": "In Progress"}
},
"sorts": [
{"property": "Created", "direction": "descending"}
],
"page_size": 50
}'
Create a Database
bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/databases" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"parent_page_id": "PAGE_ID",
"title": "Task Tracker",
"properties": {
"Name": {"title": {}},
"Status": {"select": {"options": [{"name": "To Do"}, {"name": "In Progress"}, {"name": "Done"}]}},
"Priority": {"select": {"options": [{"name": "High"}, {"name": "Medium"}, {"name": "Low"}]}},
"Due Date": {"date": {}}
}
}'

Blocks (Page Content)

Read Page Content
bash
curl -s "https://api.atris.ai/api/integrations/notion/blocks/{page_id}/children?page_size=50" \
-H "Authorization: Bearer $TOKEN"
Append Content to a Page
bash
curl -s -X PATCH "https://api.atris.ai/api/integrations/notion/blocks/{page_id}/children" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"children": [
{
"object": "block",
"type": "paragraph",
"paragraph": {"rich_text": [{"type": "text", "text": {"content": "Added via Atris!"}}]}
}
]
}'
Delete a Block
bash
curl -s -X DELETE "https://api.atris.ai/api/integrations/notion/blocks/{block_id}" \
-H "Authorization: Bearer $TOKEN"

Users

List Workspace Users
bash
curl -s "https://api.atris.ai/api/integrations/notion/users" \
-H "Authorization: Bearer $TOKEN"
Get Integration Info
bash
curl -s "https://api.atris.ai/api/integrations/notion/me" \
-H "Authorization: Bearer $TOKEN"

Comments

Get Comments on a Page
bash
curl -s "https://api.atris.ai/api/integrations/notion/comments/{page_id}" \
-H "Authorization: Bearer $TOKEN"
Add a Comment
bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/comments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"parent_id": "PAGE_ID",
"text": "This looks great! Approved."
}'
Reply to a Discussion
bash
curl -s -X POST "https://api.atris.ai/api/integrations/notion/comments" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"parent_id": "PAGE_ID",
"text": "Thanks for the feedback!",
"discussion_id": "DISCUSSION_ID"
}'

Workflows

"Search my Notion for X"
  1. Run bootstrap
  2. Search: GET /notion/search?q=X
  3. Display: title, type (page/database), last edited
"What's in my task database?"
  1. Run bootstrap
  2. Search databases: GET /notion/search?q=tasks&filter_type=database
  3. Query: POST /notion/databases/{id}/query with filters
  4. Display rows with properties
"Create a page with notes"
  1. Run bootstrap
  2. Search for parent page: GET /notion/search?q=parent+name&filter_type=page
  3. Create page: POST /notion/pages with title + children blocks
  4. Confirm: "Page created!" with link
"Add a row to a database"
  1. Run bootstrap
  2. Get database schema: GET /notion/databases/{id} (to see property names/types)
  3. Create page in database: POST /notion/pages with parent_type=database_id and matching properties
  4. Confirm with row details
"Read a page"
  1. Run bootstrap
  2. Get page metadata: GET /notion/pages/{id}
  3. Get page content: GET /notion/blocks/{id}/children
  4. Display title + content blocks
"Update task status"
  1. Run bootstrap
  2. Find the task: search or query database
  3. Update: PATCH /notion/pages/{id} with new property values
  4. Confirm the change

Block Types Reference

Common block types for creating content:

TypeKeyRich text field
Paragraphparagraphrich_text
Heading 1heading_1rich_text
Heading 2heading_2rich_text
Heading 3heading_3rich_text
Bullet listbulleted_list_itemrich_text
Numbered listnumbered_list_itemrich_text
To-doto_dorich_text + checked
Codecoderich_text + language
Quotequoterich_text
Dividerdivider(none)
Calloutcalloutrich_text + icon

Important Notes

  • Notion tokens don't expire. Once connected, it stays connected
  • Page IDs: Notion uses UUIDs like 12345678-abcd-1234-abcd-123456789abc. You can get them from URLs or search results
  • Database pages: When adding rows to a database, the "page" properties must match the database schema
  • Content = Blocks: A page's visible content is a list of blocks. Use the blocks endpoint to read/write content
  • Search scope: Only pages/databases shared with the Atris integration are visible

Error Handling

ErrorMeaningSolution
Token expiredAtrisOS session expiredRun atris login
Notion not connectedOAuth not completedRe-run bootstrap
401 UnauthorizedInvalid/expired tokenRun atris login
object_not_foundPage/database not shared with integrationShare the page with the Atris integration in Notion
validation_errorBad request formatCheck property names match database schema
restricted_resourceNo access to resourceShare with Atris integration in Notion settings

Security Model

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
58
Repository forks
2
Repository npm downloads, 7 days
256
7-day trend score
36

Stars and forks are for the whole GitHub repository, not this skill alone. Downloads are for the repository's npm package. Refreshed 20 Mar 2026, 7 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/atrislabs/atris/notion/badge)](https://verified-skill.com/skills/atrislabs/atris/notion)

Something wrong with this skill or its page? Tell us.