From notion-pack
Installs and configures Notion API SDK for Node.js (@notionhq/client) and Python (notion-client), sets up authentication tokens, shares pages with integration, and verifies connectivity.
How this skill is triggered — by the user, by Claude, or both
Slash command
/notion-pack:notion-install-authThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Set up the official Notion SDK and configure authentication for internal integrations. The Node.js SDK is `@notionhq/client` (npm) and the Python SDK is `notion-client` (pip). Both wrap the Notion API at `https://api.notion.com/v1` using API version `2022-06-28`.
Set up the official Notion SDK and configure authentication for internal integrations. The Node.js SDK is @notionhq/client (npm) and the Python SDK is notion-client (pip). Both wrap the Notion API at https://api.notion.com/v1 using API version 2022-06-28.
Create an internal integration at https://www.notion.so/my-integrations:
ntn_ or secret_)Install the SDK:
# Node.js / TypeScript (official SDK)
npm install @notionhq/client
# Python (official SDK)
pip install notion-client
Store the token in environment variables -- never hardcode it:
# Set environment variable
export NOTION_TOKEN="ntn_your_integration_secret_here"
# Or add to .env file (add .env to .gitignore)
echo 'NOTION_TOKEN=ntn_your_integration_secret_here' >> .env
Share pages with your integration: In Notion, open the page or database you want to access. Click the ... menu, select Connections, and add your integration. Without this step, all API calls return object_not_found.
import { Client } from '@notionhq/client';
const notion = new Client({ auth: process.env.NOTION_TOKEN });
const me = await notion.users.me({});
console.log(`Authenticated as: ${me.name} (${me.type})`);
console.log(`Bot ID: ${me.id}`);
If the bot user is returned, authentication is working.
@notionhq/client for Node.js, notion-client for Python)NOTION_TOKEN configuredusers.me() call| Error | Cause | Solution |
|---|---|---|
unauthorized | Invalid or expired token | Regenerate at notion.so/my-integrations |
object_not_found | Page not shared with integration | Open page > ... > Connections > add integration |
restricted_resource | Missing capabilities | Edit integration capabilities in dashboard |
validation_error | Malformed request body | Check SDK version and parameter types |
rate_limited | Too many requests (3 req/s avg) | Add exponential backoff; SDK retries automatically |
MODULE_NOT_FOUND | SDK not installed | Run npm install @notionhq/client |
import { Client } from '@notionhq/client';
const notion = new Client({
auth: process.env.NOTION_TOKEN,
timeoutMs: 60_000,
notionVersion: '2022-06-28',
});
// Verify connection
const me = await notion.users.me({});
console.log(`Connected as ${me.name}`);
// List all users in the workspace
const users = await notion.users.list({});
console.log(`Workspace has ${users.results.length} users`);
import os
from notion_client import Client
notion = Client(auth=os.environ["NOTION_TOKEN"])
# Verify connection
me = notion.users.me()
print(f"Connected as {me['name']} ({me['type']})")
# List all users in the workspace
users = notion.users.list()
print(f"Workspace has {len(users['results'])} users")
After successful auth, proceed to notion-hello-world for your first page query.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin notion-packSecures Notion API integrations with token storage, OAuth2 flows, least-privilege capabilities, page access auditing, and credential rotation using @notionhq/client.
Interact with Notion workspaces via official API CLI: manage pages, databases, blocks, users, comments, and search. For AI agents or developers automating Notion tasks.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.