본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

notion

Notion API와 `ntn` 또는 curl을 사용해 페이지와 데이터베이스를 검색·읽기·생성·수정하고, Markdown과 파일 업로드를 처리합니다. 정기 동기화, 호출 가능한 도구, 웹훅을 위한 Workers도 만들고 배포할 수 있습니다.

원문원문 설명 보기

Notion API + ntn CLI: pages, databases, markdown, Workers.

NousResearch/hermes-agent스타 258,450(GitHub 258,450 + cccskills 0)
연동 도구Notion

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • Notion 페이지를 찾아 요약할 때
  • Markdown으로 페이지를 만들거나 수정할 때
  • 조건에 맞는 데이터베이스 레코드를 찾을 때
  • Notion에 파일을 올릴 때
  • 동기화나 웹훅용 Worker를 만들 때

한국어 소개

할 수 있는 일

Notion API와 ntn CLI 또는 HTTP 요청으로 페이지를 검색하고 읽거나 생성·수정할 수 있습니다. 데이터베이스를 조회하고 레코드를 다루며 파일을 업로드하는 작업도 지원합니다. 페이지 내용은 Markdown으로 읽고 쓸 수 있고, 구조가 필요하면 블록 단위로 처리합니다. ntn을 사용하면 외부 서비스와 정기적으로 동기화하거나 Notion Custom Agents에서 호출할 도구를 제공하고 웹훅을 받는 Workers를 만들어 배포할 수 있습니다.

이럴 때 유용합니다

회의 기록을 Notion에 추가하거나, 에이전트가 페이지 내용을 읽고 요약하도록 할 때 활용할 수 있습니다. 조건에 맞는 데이터베이스 레코드를 찾거나 파일을 첨부할 때도 적합합니다. 외부 서비스의 정보를 일정에 따라 Notion에 반영하려는 경우에도 사용할 수 있습니다.

사용 예시

  • “이 페이지를 읽고 핵심 내용을 요약해 주세요.”
  • “이 회의록을 Markdown으로 새 Notion 페이지에 만들어 주세요.”
  • “Status가 Active인 레코드를 찾아 주세요.”

주의 사항

Notion Integration Token이 필요하며, 대상 페이지나 데이터베이스를 해당 Integration과 공유해야 합니다. ntn은 macOS와 Linux에서 사용할 수 있고, Windows에서는 curl을 사용합니다. Workers를 배포하려면 Business 또는 Enterprise 요금제가 필요합니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
B일부 부족페이지 수정과 Worker 배포가 있지만 확인 절차는 발췌문에 없습니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족Integration Token과 공유 설정이 필요하며 `ntn` 설치 절차도 있습니다.

점수에는 넣지 않았습니다. 2026년 10월 30일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(2)

  • SKILL.md14.3 KB
  • references/block-types.md3.0 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Notion

Talk to Notion two ways. Same integration token works for both — pick by what's available.

◆ ntn CLI — Notion's official CLI. Shorter syntax, one-line file uploads, required for Workers. macOS + Linux only as of May 2026 (Windows support "coming soon"). Default when installed. ◆ HTTP + curl — works everywhere including Windows. Default fallback when ntn isn't installed.

Setup

1. Get an integration token (required for both paths)

  1. Create an integration at https://notion.so/my-integrations
  2. Copy the API key (starts with ntn_ or secret_)
  3. Store in ${HERMES_HOME:-~/.hermes}/.env:
    NOTION_API_KEY=ntn_your_key_here
    
  4. Share target pages/databases with the integration in Notion: page menu ... → Connect to → your integration name. Without this, the API returns 404 for that page even though it exists.

2. Install ntn (preferred path on macOS / Linux)

# Recommended
curl -fsSL https://ntn.dev | bash

# Or via npm (needs Node 22+, npm 10+)
npm install --global ntn

ntn --version    # verify

Skip ntn login — use the integration token instead. This works headlessly, no browser needed:

export NOTION_API_TOKEN=$NOTION_API_KEY      # ntn reads NOTION_API_TOKEN
export NOTION_KEYRING=0                       # don't try to use the OS keychain

Add those exports to your shell profile (or to ${HERMES_HOME:-~/.hermes}/.env) so every session inherits them.

3. Choose path at runtime

if command -v ntn >/dev/null 2>&1; then
  # use ntn
else
  # fall back to curl
fi

Windows users: skip step 2 entirely until native ntn ships — Path B works fine. If you want CLI ergonomics now, install ntn inside WSL2.

API Basics

Notion-Version: 2025-09-03 is required on all HTTP requests. ntn handles this for you. In this version, what users call "databases" are called data sources in the API.

Path A — ntn CLI (preferred, macOS / Linux)

Raw API calls (shorthand for curl)

ntn api v1/users                                  # GET
# POST with inline body
ntn api v1/pages parent[page_id]=abc123 \
  properties[title][0][text][content]="Notes"
ntn api v1/pages/abc123 -X PATCH archived:=true   # PATCH; := is non-string (bool/num/null)

Syntax notes:

  • key=value — string fields
  • key[nested]=value — nested object fields
  • key:=value — typed assignment (booleans, numbers, null, arrays)

Search

ntn api v1/search query="page title"

Read page metadata

ntn api v1/pages/{page_id}

Read page as Markdown (agent-friendly)

ntn api v1/pages/{page_id}/markdown

Read page content as blocks

ntn api v1/blocks/{page_id}/children

Create page from Markdown

ntn api v1/pages \
  parent[page_id]=xxx \
  properties[title][0][text][content]="Notes from meeting" \
  markdown="# Agenda

- Q3 roadmap
- Hiring"

Patch a page with Markdown

ntn api v1/pages/{page_id}/markdown -X PATCH \
  markdown="## Update

Shipped the prototype."

Query a database (data source)

ntn api v1/data_sources/{data_source_id}/query -X POST \
  filter[property]=Status filter[select][equals]=Active

For complex queries with sorts, multiple filter clauses, or compound logic, pipe JSON in:

echo '{"filter": {"property": "Status", "select": {"equals": "Active"}}, "sorts": [{"property": "Date", "direction": "descending"}]}' | \
  ntn api v1/data_sources/{data_source_id}/query -X POST --json -

File uploads (one-liner — biggest CLI win)

ntn files create < photo.png
ntn files create --external-url https://example.com/photo.png
ntn files list

Compare to the 3-step HTTP flow (create upload → PUT bytes → reference).

Useful env vars

VarEffect
NOTION_API_TOKENAuth token (overrides keychain) — set this to your integration token
NOTION_KEYRING=0File-based creds at ~/.config/notion/auth.json instead of OS keychain
NOTION_WORKSPACE_IDSkip the workspace picker prompt

Path B — HTTP + curl (cross-platform, default on Windows)

All requests share this pattern:

curl -s -X GET "https://api.notion.com/v1/..." \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json"

On Windows the curl shipped with Windows 10+ works as-is. PowerShell users can also use Invoke-RestMethod.

Search

curl -s -X POST "https://api.notion.com/v1/search" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{"query": "page title"}'

Read page metadata

curl -s "https://api.notion.com/v1/pages/{page_id}" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03"

Read page as Markdown (agent-friendly)

Easier to feed to a model than block JSON.

curl -s "https://api.notion.com/v1/pages/{page_id}/markdown" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03"

Read page content as blocks (when you need structure)

curl -s "https://api.notion.com/v1/blocks/{page_id}/children" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03"

Create page from Markdown

POST /v1/pages accepts a markdown body param.

curl -s -X POST "https://api.notion.com/v1/pages" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{
    "parent": {"page_id": "xxx"},
    "properties": {"title": [{"text": {"content": "Notes from meeting"}}]},
    "markdown": "# Agenda\n\n- Q3 roadmap\n- Hiring\n\n## Decisions\n- Ship MVP Friday"
  }'

Patch a page with Markdown

curl -s -X PATCH "https://api.notion.com/v1/pages/{page_id}/markdown" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{"markdown": "## Update\n\nShipped the prototype."}'

Create page in a database (typed properties)

curl -s -X POST "https://api.notion.com/v1/pages" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{
    "parent": {"database_id": "xxx"},
    "properties": {
      "Name": {"title": [{"text": {"content": "New Item"}}]},
      "Status": {"select": {"name": "Todo"}}
    }
  }'

Query a database (data source)

curl -s -X POST "https://api.notion.com/v1/data_sources/{data_source_id}/query" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {"property": "Status", "select": {"equals": "Active"}},
    "sorts": [{"property": "Date", "direction": "descending"}]
  }'

Create a database

curl -s -X POST "https://api.notion.com/v1/data_sources" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{
    "parent": {"page_id": "xxx"},
    "title": [{"text": {"content": "My Database"}}],
    "properties": {
      "Name": {"title": {}},
      "Status": {"select": {"options": [{"name": "Todo"}, {"name": "Done"}]}},
      "Date": {"date": {}}
    }
  }'

Update page properties

curl -s -X PATCH "https://api.notion.com/v1/pages/{page_id}" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{"properties": {"Status": {"select": {"name": "Done"}}}}'

Append blocks to a page

curl -s -X PATCH "https://api.notion.com/v1/blocks/{page_id}/children" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{
    "children": [
      {"object": "block", "type": "paragraph", "paragraph": {"rich_text": [{"text": {"content": "Hello from Hermes!"}}]}}
    ]
  }'

File uploads (3-step flow)

# 1. Create upload
curl -s -X POST "https://api.notion.com/v1/file_uploads" \
  -H "Authorization: Bearer $NOTION_API_KEY" \
  -H "Notion-Version: 2025-09-03" \
  -H "Content-Type: application/json" \
  -d '{"filename": "photo.png", "content_type": "image/png"}'

# 2. PUT bytes to the upload_url returned above
curl -s -X PUT "{upload_url}" --data-binary @photo.png

# 3. Reference {file_upload_id} in a page/block payload

Property Types

Common property formats for database items:

  • Title: {"title": [{"text": {"content": "..."}}]}
  • Rich text: {"rich_text": [{"text": {"content": "..."}}]}
  • Select: {"select": {"name": "Option"}}
  • Multi-select: {"multi_select": [{"name": "A"}, {"name": "B"}]}
  • Date: {"date": {"start": "2026-01-15", "end": "2026-01-16"}}
  • Checkbox: {"checkbox": true}
  • Number: {"number": 42}
  • URL: {"url": "https://..."}
  • Email: {"email": "user@example.com"}
  • Relation: {"relation": [{"id": "page_id"}]}

API Version 2025-09-03 — Databases vs Data Sources

  • Databases became data sources. Use /data_sources/ endpoints for queries and retrieval.
  • Two IDs per database: database_id and data_source_id.
    • database_id when creating pages: parent: {"database_id": "..."}
    • data_source_id when querying: POST /v1/data_sources/{id}/query
  • Search returns databases as "object": "data_source" with the data_source_id field.

Notion Workers (advanced, requires ntn)

Workers are TypeScript programs Notion hosts for you. One worker can expose any combination of:

  • Syncs — pull data from external APIs into a Notion database on a schedule (default 30 min).
  • Tools — appear as callable tools inside Notion's Custom Agents.
  • Webhooks — receive HTTP events from external services (GitHub, Stripe, etc.) and act in Notion.

Plan / platform gating:

  • CLI works on all plans. Deploying Workers requires Business or Enterprise.
  • ntn is macOS/Linux only as of May 2026. Windows users need WSL2 or to wait for native support.
  • Free through August 11, 2026; metered on Notion credits after.

Minimal Worker

ntn workers new my-worker      # scaffold
cd my-worker
# Edit src/index.ts
ntn workers deploy --name my-worker

src/index.ts:

import { Worker } from "@notionhq/workers";

const worker = new Worker();
export default worker;

worker.tool("greet", {
  title: "Greet a User",
  description: "Returns a friendly greeting",
  inputSchema: { type: "object", properties: { name: { type: "string" } }, required: ["name"] },
  execute: async ({ name }) => `Hello, ${name}!`,
});

Webhook capability

worker.webhook("onGithubPush", {
  title: "GitHub Push Handler",
  execute: async (events, { notion }) => {
    for (const event of events) {
      // event.body, event.rawBody (for signature verification), event.headers
      console.log("got delivery", event.deliveryId);
    }
  },
});

After deploy: ntn workers webhooks list shows the URL Notion generates. Treat that URL as a secret — anyone with it can POST events unless you add signature verification.

Worker lifecycle commands

ntn workers deploy
ntn workers list
ntn workers exec <capability-key> -d '{"name": "world"}'
ntn workers sync trigger <key>            # run a sync now
ntn workers sync pause <key>
ntn workers env set GITHUB_WEBHOOK_SECRET=...
ntn workers runs list                     # recent invocations
ntn workers runs logs <run-id>
ntn workers webhooks list

When asked to build a Worker, scaffold with ntn workers new, write the code in src/index.ts, set any secrets with ntn workers env set, and deploy. Notion's docs at https://developers.notion.com/workers cover the full API surface.

Notion-Flavored Markdown (used by /markdown endpoints)

Standard CommonMark plus XML-like tags for Notion-specific blocks. Use tabs for indentation.

Blocks beyond CommonMark:

<callout icon="🎯" color="blue_bg">
	Ship the MVP by **Friday**.
</callout>

<details color="gray">
<summary>Toggle title</summary>
	Children indented one tab
</details>

<columns>
	<column>Left side</column>
	<column>Right side</column>
</columns>

<table_of_contents color="gray"/>

Inline:

  • Mentions: <mention-user url="..."/>, <mention-page url="...">Title</mention-page>, <mention-date start="2026-05-15"/>
  • Underline: <span underline="true">text</span>
  • Color: <span color="blue">text</span> or block-level {color="blue"} on the first line
  • Math: inline $x^2$, block $$ ... $$
  • Citations: [^https://example.com]

Colors: gray brown orange yellow green blue purple pink red, plus *_bg variants for backgrounds.

Headings 5/6 collapse to H4. Multiple > lines render as separate quote blocks — use <br> inside a single > for multi-line quotes.

Choosing the Right Path

Taskmac / LinuxWindows
Read/write pages, search, query databasesntn api ...curl
Read a page for an agent to summarizentn api v1/pages/{id}/markdowncurl /markdown endpoint
Upload a filentn files create < file3-step HTTP flow
One-off API explorationntn api ...curl
Build a sync / webhook / agent tool hosted by Notionntn workers ...WSL2 + ntn workers ...

Notes

  • Page/database IDs are UUIDs (with or without dashes — both accepted).
  • Rate limit: ~3 requests/second average. The CLI doesn't bypass this.
  • The API cannot set database view filters — that's UI-only.
  • Use "is_inline": true when creating data sources to embed them in a page.
  • Always pass -s to curl to suppress progress bars (cleaner agent output).
  • Pipe JSON through jq when reading: ... | jq '.results[0].properties'.
  • Notion also ships an MCP server now (Notion MCP, ~91% more token-efficient on DB ops than the previous version) — wire it via Hermes' MCP support if you want streaming Notion access from inside a session, but the paths above are enough for most one-shot tasks.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

1password

무료요약 있음

1Password에 저장한 비밀번호와 API 키를 명령과 설정 템플릿에 사용합니다. CLI 설치와 인증부터 비밀 값 조회 및 환경 변수 전달까지 안내합니다.

  • 1Password CLI 설치와 설정
  • 저장된 API 키로 명령 실행
  • 설정 템플릿에 비밀 값 삽입
NousResearch/hermes-agent25.8만2026년 10월 29일 업데이트

3-statement-model

무료요약 있음

손익계산서·재무상태표·현금흐름표를 수식으로 연결한 Excel 모델을 만듭니다. 실적과 예측 가정을 입력하고 시나리오를 비교하며 세 재무제표의 일관성을 단계별로 확인합니다.

  • 재무 템플릿에 실적 입력
  • 세 재무제표가 연동되는 예측 작성
  • 기본·상향·하향 시나리오 비교
NousResearch/hermes-agent25.8만2026년 10월 29일 업데이트

accelerate

무료요약 있음

기존 PyTorch 학습 코드를 적은 수정으로 여러 GPU나 컴퓨터에 맞게 구성합니다. 혼합 정밀도, 메모리 절약 설정과 학습 실행 방법을 안내합니다.

  • 단일 GPU 학습을 여러 GPU로 옮깁니다
  • 혼합 정밀도 학습을 설정합니다
  • DeepSpeed나 FSDP로 메모리를 절약합니다
NousResearch/hermes-agent25.8만2026년 10월 29일 업데이트

actual-setup

무료요약 있음

Hermes에서 Actual Computer로 자신의 기기에 AI 모델을 실행하도록 연결을 설정합니다. 중계 서비스와 로컬 연결, 모델 선택, 응답 확인 및 오류 점검을 다룹니다.

  • Actual 키로 Hermes를 연결합니다
  • 자신의 기기에서 모델을 실행합니다
  • 로컬 모델을 찾아 내려받고 불러옵니다
NousResearch/hermes-agent25.8만2026년 10월 29일 업데이트

adversarial-ux-test

무료요약 있음

기술에 익숙하지 않고 쉽게 불만을 느끼는 사용자로 앱을 시험합니다. 혼란스러운 조작과 이탈 원인을 찾고, 개선 과제와 개인적 불만을 나눠 수정안을 정리합니다.

  • 출시나 시연 전에 사용성을 확인합니다
  • 신규 사용자의 경험을 점검합니다
  • 가입과 결제 과정의 어려움을 찾습니다
NousResearch/hermes-agent25.8만2026년 10월 29일 업데이트

agent-merge-conflict-arbiter

무료요약 있음

두 에이전트가 각각 수정한 브랜치의 Git 충돌을 양쪽 변경 내용과 의도에 따라 중립적으로 해결합니다. 충돌별 판단 이유를 기록하고 빌드나 테스트로 통합 결과를 확인합니다.

  • 두 에이전트의 브랜치 충돌 해결
  • 병렬 worktree의 변경 내용 통합
  • 충돌하는 설계 판단의 이유 확인
NousResearch/hermes-agent25.8만2026년 10월 29일 업데이트

NousResearch의 스킬 모두 보기

이 스킬의 문제 신고