Source profileQuality 99/100

terrylica/cc-skills/plugins/productivity-tools/skills/notion-sdk/SKILL.md

notion-sdk

Control Notion via Python SDK. TRIGGERS - Notion API, create page, query database, add blocks.

Source repository stars
62
Declared platforms
0
Static risk flags
0
Last source update
2026-08-24
Source checked
2026-08-25

Decision brief

What it does: where it fits

Control Notion programmatically using the official notion-client Python SDK. See PyPI for current version.

Best for

  • Creating pages or databases in Notion via API
  • Querying Notion databases programmatically
  • Adding blocks (text, code, headings) to Notion pages

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/terrylica/cc-skills --skill "plugins/productivity-tools/skills/notion-sdk"
Safe inspection promptEditorial

Inspect the Agent Skill "notion-sdk" from https://github.com/terrylica/cc-skills/blob/a5f847b22ee5afa35677e446973a903d098cd1d4/plugins/productivity-tools/skills/notion-sdk/SKILL.md at commit a5f847b22ee5afa35677e446973a903d098cd1d4. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Quick Start

    python from scripts.querydatabase import ( querydatasource, checkboxfilter, statusfilter, andfilter, sortbyproperty, )

    python from scripts.querydatabase import ( querydatasource, checkboxfilter, statusfilter, andfilter, sortbyproperty, )
  2. 02

    When to Use This Skill

    Creating pages or databases in Notion via API

    Creating pages or databases in Notion via APIQuerying Notion databases programmaticallyAdding blocks (text, code, headings) to Notion pages
  3. 03

    Preflight: Token Collection

    Before any Notion API operation, collect the integration token:

    Validate format (must start with ntn or secret)Test with validatetoken() from scripts/notionwrapper.pyRemind user: Each page/database must be shared with the integration
  4. 04

    1. Create a Page in Database

    Review the “1. Create a Page in Database” section in the pinned source before continuing.

    Review and apply the “1. Create a Page in Database” source section.
  5. 05

    2. Add Content Blocks

    Review the “2. Add Content Blocks” section in the pinned source before continuing.

    Review and apply the “2. Add Content Blocks” source section.

Permission review

Static risk signals and limitations

No configured static risk pattern was detected

This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score99/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars62SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
terrylica/cc-skills
Skill path
plugins/productivity-tools/skills/notion-sdk/SKILL.md
Commit
a5f847b22ee5afa35677e446973a903d098cd1d4
License
MIT
Collected
2026-08-25
Default branch
main
View the original SKILL.md

Notion SDK Skill

Control Notion programmatically using the official notion-client Python SDK. See PyPI for current version.

Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.

When to Use This Skill

Use this skill when:

  • Creating pages or databases in Notion via API
  • Querying Notion databases programmatically
  • Adding blocks (text, code, headings) to Notion pages
  • Automating Notion workflows with Python
  • Integrating external data sources with Notion

Preflight: Token Collection

Before any Notion API operation, collect the integration token:

AskUserQuestion(questions=[{
    "question": "Please provide your Notion Integration Token (starts with ntn_ or secret_)",
    "header": "Notion Token",
    "options": [
        {"label": "I have a token ready", "description": "Token from notion.so/my-integrations"},
        {"label": "Need to create one", "description": "Go to notion.so/my-integrations → New integration"}
    ],
    "multiSelect": false
}])

After user provides token:

  1. Validate format (must start with ntn_ or secret_)
  2. Test with validate_token() from scripts/notion_wrapper.py
  3. Remind user: Each page/database must be shared with the integration

Quick Start

1. Create a Page in Database

from notion_client import Client
from scripts.create_page import (
    create_database_page,
    title_property,
    status_property,
    date_property,
)

client = Client(auth="ntn_...")
page = create_database_page(
    client,
    data_source_id="abc123...",  # Database ID
    properties={
        "Name": title_property("My New Task"),
        "Status": status_property("In Progress"),
        "Due Date": date_property("2025-12-31"),
    }
)
print(f"Created: {page['url']}")

2. Add Content Blocks

from scripts.add_blocks import (
    append_blocks,
    heading,
    paragraph,
    bullet,
    code_block,
    callout,
)

blocks = [
    heading("Overview", level=2),
    paragraph("This page was created via the Notion API."),
    callout("Remember to share the page with your integration!", emoji="⚠️"),
    heading("Tasks", level=3),
    bullet("First task"),
    bullet("Second task"),
    code_block("print('Hello, Notion!')", language="python"),
]
append_blocks(client, page["id"], blocks)

3. Query Database

from scripts.query_database import (
    query_data_source,
    checkbox_filter,
    status_filter,
    and_filter,
    sort_by_property,
)

# Find incomplete high-priority items
results = query_data_source(
    client,
    data_source_id="abc123...",
    filter_obj=and_filter(
        checkbox_filter("Done", False),
        status_filter("Priority", "High")
    ),
    sorts=[sort_by_property("Due Date", "ascending")]
)
for page in results:
    title = page["properties"]["Name"]["title"][0]["plain_text"]
    print(f"- {title}")

Available Scripts

ScriptPurpose
notion_wrapper.pyClient setup, token validation, retry wrapper
create_page.pyCreate pages, property builders
add_blocks.pyAppend blocks, block type builders
query_database.pyQuery, filter, sort, search

References

Important Constraints

Rate Limits

  • 3 requests/second average (burst tolerated briefly)
  • Use api_call_with_retry() for automatic rate limit handling
  • 429 responses include Retry-After header

Authentication Model

  • Page-level sharing required (not workspace-wide)
  • User must explicitly add integration to each page/database:
    • Page → ... menu → Connections → Add connection → Select integration

API Version (v2.6.0+)

  • Uses data_source_id instead of database_id for multi-source databases
  • Legacy database_id still works for simple databases
  • Scripts handle both patterns automatically

Operations NOT Supported

  • Workspace settings modification
  • User permissions management
  • Template creation/management
  • Billing/subscription access

API Behavior Patterns

Insights discovered through integration testing (test citations for verification).

Rate Limiting & Retry Logic

api_call_with_retry() handles transient failures automatically:

Error TypeBehaviorWait Strategy
429 Rate LimitedRetriesRespects Retry-After header (default 1s)
500 Server ErrorRetriesExponential backoff: 1s, 2s, 4s
Auth/ValidationFails immediatelyNo retry

Citation: test_client.py::TestRetryLogic (lines 146-193)

Read-After-Write Consistency

Newly created blocks may not be immediately queryable. Add 0.5s minimum delay:

append_blocks(client, page_id, blocks)
time.sleep(0.5)  # Eventual consistency delay
children = client.blocks.children.list(page_id)

Citation: test_integration.py::TestBlockAppend::test_retrieve_appended_blocks (line 298)

v2.6.0 API Migration

Old PatternNew Pattern (v2.6.0+)
client.databases.query()client.data_sources.query()
filter: {"value": "database"}filter: {"value": "data_source"}

Citation: test_integration.py::TestDatabaseQuery (line 110)

Archive-Only Deletion

Pages cannot be permanently deleted via API - only archived (moved to trash):

client.pages.update(page_id, archived=True)  # Trash, not delete

Citation: test_integration.py cleanup fixture (lines 72-76)

Edge Cases & Validation

Property Builder Edge Cases

InputBehaviorValid?
Empty string ""Creates empty contentYes
Empty array []Clears multi-select/relationsYes
None for numberClears property valueYes
Zero 0Valid number (not falsy)Yes
Negative -42Valid numberYes
Unicode/emojiFully preservedYes

Citation: test_property_builders.py::TestPropertyBuildersEdgeCases (lines 302-341)

Input Validation Responsibility

Builders are intentionally permissive - validation happens at API level:

PropertyBuilder AcceptsAPI Validates
DateAny stringISO 8601 only
URLAny stringValid URL format
CheckboxTruthy valuesBoolean expected

Best Practice: Validate in your application before building properties.

Citation: test_property_builders.py::TestPropertyBuildersInvalidInputs (lines 347-376)

Token Validation

  • Case-sensitive: Only lowercase ntn_ and secret_ valid
  • Format check happens before API call (saves unnecessary requests)
  • Empty/whitespace tokens rejected immediately

Citation: test_client.py::TestClientEdgeCases (lines 196-224)

Query & Filter Patterns

Compound Filter Composition

# Empty compound (matches all)
and_filter()  # {"and": []}

# Deep nesting supported
and_filter(
    or_filter(filter_a, filter_b),
    and_filter(filter_c, filter_d)
)

Citation: test_filter_builders.py::TestFilterEdgeCases (lines 323-360)

Filter Limitations

Filters don't exclude NULL properties - check in Python:

if row["properties"]["Rating"]["number"] is not None:
    # Process non-null values

Citation: test_integration.py::TestDatabaseQuery::test_query_database_with_filter (lines 120-135)

Pagination Invariants

Conditionhas_morenext_cursor
More results existTruePresent, non-None
No more resultsFalseMay be absent/None

Always check has_more before using next_cursor.

Citation: test_integration.py::TestDatabaseQuery::test_query_database_with_pagination (lines 137-151)

Error Handling

from notion_client import APIResponseError, APIErrorCode

try:
    result = client.pages.create(...)
except APIResponseError as e:
    if e.code == APIErrorCode.ObjectNotFound:
        print("Page/database not found or not shared with integration")
    elif e.code == APIErrorCode.Unauthorized:
        print("Token invalid or expired")
    elif e.code == APIErrorCode.RateLimited:
        print(f"Rate limited. Retry after {e.additional_data.get('retry_after')}s")
    else:
        raise

Installation

uv pip install notion-client  # v2.6+ required for data_source support

Or use PEP 723 inline dependencies (scripts include them).


Troubleshooting

IssueCauseSolution
Object not foundPage not shared with integrationShare page: ... menu → Connections → Add integration
UnauthorizedToken invalid or expiredGenerate new token at notion.so/my-integrations
Rate limited (429)Too many requestsUse api_call_with_retry() for automatic handling
Empty results from queryFilter matches nothingVerify filter syntax and property names
Block not found after createEventual consistency delayAdd 0.5s delay after write before read
Invalid property typeWrong builder usedCheck property type in database schema
Token format rejectedWrong prefix (case-sensitive)Token must start with ntn_ or secret_ (lowercase)
Data source ID not workingOld API versionUpgrade notion-client to latest version

Post-Execution Reflection

After this skill completes, check before closing:

  1. Did the command succeed? — If not, fix the instruction or error table that caused the failure.
  2. Did parameters or output change? — If the underlying tool's interface drifted, update Usage examples and Parameters table to match.
  3. Was a workaround needed? — If you had to improvise (different flags, extra steps), update this SKILL.md so the next invocation doesn't need the same workaround.

Only update if the issue is real and reproducible — not speculative.

Frequently asked questions

What to verify before installation and use

What does the notion-sdk source document cover?

Control Notion programmatically using the official notion-client Python SDK. See PyPI for current version.

How do I install notion-sdk?

The source record exposes this install command: npx skills add https://github.com/terrylica/cc-skills --skill "plugins/productivity-tools/skills/notion-sdk". Inspect the command and pinned source before running it.

Alternatives

Compare before choosing

Computed 9834,322

K-Dense-AI/scientific-agent-skills

dask

Distributed computing for larger-than-RAM pandas/NumPy workflows. Use when you need to scale existing pandas/NumPy code beyond memory or across clusters. Best for parallel file processing, distributed ML, integration with existing pandas code. For out-of-core analytics on single machine use vaex; for in-memory speed use polars.

Computed 9834,322

K-Dense-AI/scientific-agent-skills

medchem

Medicinal chemistry filters for compound triage. Apply drug-likeness rules (Lipinski, Veber, CNS), structural alert catalogs (PAINS, NIBR, ChEMBL), complexity metrics, and the medchem query language for library filtering.

Computed 9834,322

K-Dense-AI/scientific-agent-skills

neurokit2

Use NeuroKit2 to build or audit reproducible research workflows for physiological time-series preprocessing, event/interval analysis, multimodal alignment, variability, and complexity. Trigger when code imports neurokit2 or needs its current APIs, schemas, and method-aware validation—not for diagnosis or device validation.

Computed 9811,156

Jeffallan/claude-skills

fastapi-expert

Use when building high-performance async Python APIs with FastAPI and Pydantic V2. Invoke to create REST endpoints, define Pydantic models, implement authentication flows, set up async SQLAlchemy database operations, add JWT authentication, build WebSocket endpoints, or generate OpenAPI documentation. Trigger terms: FastAPI, Pydantic, async Python, Python API, REST API Python, SQLAlchemy async, JWT authentication, OpenAPI, Swagger Python.