mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-15 04:12:25 +00:00
Completes the Windows-gating coverage for the built-in skills/ tree. Every
bundled SKILL.md now carries an explicit platforms: declaration so the
loader (agent.skill_utils.skill_matches_platform) can skip-load skills
that don't fit the current OS.
74 skills declared cross-platform (platforms: [linux, macos, windows]):
Creative (16): ascii-art, ascii-video, architecture-diagram, baoyu-comic,
baoyu-infographic, claude-design, creative-ideation, design-md,
excalidraw, humanizer, manim-video, p5js, pixel-art,
popular-web-designs, pretext, sketch, songwriting-and-ai-music,
touchdesigner-mcp
Autonomous agents: claude-code, codex, hermes-agent, opencode
Data/devops: jupyter-live-kernel, kanban-orchestrator, kanban-worker,
webhook-subscriptions, dogfood, codebase-inspection
GitHub: github-auth, github-code-review, github-issues,
github-pr-workflow, github-repo-management
Media: gif-search, heartmula, songsee, spotify, youtube-content
MCP / email / gaming / notes / smart-home: native-mcp, himalaya,
pokemon-player, obsidian, openhue
mlops (non-broken): weights-and-biases, huggingface-hub, llama-cpp,
outlines, segment-anything-model, dspy, trl-fine-tuning
Productivity: airtable, google-workspace, linear, maps, nano-pdf,
notion, ocr-and-documents, powerpoint
Red-teaming / research: godmode, arxiv, blogwatcher, llm-wiki,
polymarket
Software-dev: debugging-hermes-tui-commands, hermes-agent-skill-authoring,
node-inspect-debugger, plan, requesting-code-review, spike,
subagent-driven-development, systematic-debugging,
test-driven-development, writing-plans
Misc: yuanbao
5 skills gated from Windows (platforms: [linux, macos]):
mlops/inference/vllm (serving-llms-vllm)
vLLM is officially Linux-only; Windows requires WSL.
mlops/training/axolotl
Axolotl's flash-attn + deepspeed + bitsandbytes stack is Linux-first.
mlops/training/unsloth
Requires Triton + xformers + flash-attn — Linux only in practice.
mlops/models/audiocraft (audiocraft-audio-generation)
torchaudio ffmpeg backend + encodec dependencies are Linux-first.
mlops/inference/obliteratus
Research abliteration workflow; relies on Linux-focused pytorch
kernels and MLX — no first-class Windows path.
Same strict-over-lenient policy as the optional-skills sweep: when the
underlying tool's Windows support is rough, missing, or WSL-only, gate the
skill. Easier to un-gate after verified Windows support lands than to leak
partial support that manifests as mid-task failures.
Combined with prior commits in this branch, every bundled SKILL.md
(skills/ + optional-skills/) now has a platforms: declaration.
172 lines
5.1 KiB
Markdown
172 lines
5.1 KiB
Markdown
---
|
|
name: notion
|
|
description: "Notion API via curl: pages, databases, blocks, search."
|
|
version: 1.0.0
|
|
author: community
|
|
license: MIT
|
|
platforms: [linux, macos, windows]
|
|
metadata:
|
|
hermes:
|
|
tags: [Notion, Productivity, Notes, Database, API]
|
|
homepage: https://developers.notion.com
|
|
prerequisites:
|
|
env_vars: [NOTION_API_KEY]
|
|
---
|
|
|
|
# Notion API
|
|
|
|
Use the Notion API via curl to create, read, update pages, databases (data sources), and blocks. No extra tools needed — just curl and a Notion API key.
|
|
|
|
## Prerequisites
|
|
|
|
1. Create an integration at https://notion.so/my-integrations
|
|
2. Copy the API key (starts with `ntn_` or `secret_`)
|
|
3. Store it in `~/.hermes/.env`:
|
|
```
|
|
NOTION_API_KEY=ntn_your_key_here
|
|
```
|
|
4. **Important:** Share target pages/databases with your integration in Notion (click "..." → "Connect to" → your integration name)
|
|
|
|
## API Basics
|
|
|
|
All requests use this pattern:
|
|
|
|
```bash
|
|
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"
|
|
```
|
|
|
|
The `Notion-Version` header is required. This skill uses `2025-09-03` (latest). In this version, databases are called "data sources" in the API.
|
|
|
|
## Common Operations
|
|
|
|
### Search
|
|
|
|
```bash
|
|
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"}'
|
|
```
|
|
|
|
### Get Page
|
|
|
|
```bash
|
|
curl -s "https://api.notion.com/v1/pages/{page_id}" \
|
|
-H "Authorization: Bearer $NOTION_API_KEY" \
|
|
-H "Notion-Version: 2025-09-03"
|
|
```
|
|
|
|
### Get Page Content (blocks)
|
|
|
|
```bash
|
|
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 in a Database
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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"}}}}'
|
|
```
|
|
|
|
### Add Content to a Page
|
|
|
|
```bash
|
|
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!"}}]}}
|
|
]
|
|
}'
|
|
```
|
|
|
|
## 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"}]}`
|
|
|
|
## Key Differences in API Version 2025-09-03
|
|
|
|
- **Databases → Data Sources:** Use `/data_sources/` endpoints for queries and retrieval
|
|
- **Two IDs:** Each database has both a `database_id` and a `data_source_id`
|
|
- Use `database_id` when creating pages (`parent: {"database_id": "..."}`)
|
|
- Use `data_source_id` when querying (`POST /v1/data_sources/{id}/query`)
|
|
- **Search results:** Databases return as `"object": "data_source"` with their `data_source_id`
|
|
|
|
## Notes
|
|
|
|
- Page/database IDs are UUIDs (with or without dashes)
|
|
- Rate limit: ~3 requests/second average
|
|
- The API cannot set database view filters — that's UI-only
|
|
- Use `is_inline: true` when creating data sources to embed them in pages
|
|
- Add `-s` flag to curl to suppress progress bars (cleaner output for Hermes)
|
|
- Pipe output through `jq` for readable JSON: `... | jq '.results[0].properties'`
|