@qvac/skills 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +198 -0
- package/README.md +49 -0
- package/index.d.ts +4 -0
- package/index.js +9 -0
- package/package.json +87 -1
- package/skills/apple-notes/SKILL.md +92 -0
- package/skills/apple-notes/append-note.applescript +9 -0
- package/skills/apple-notes/cli.schema.json +32 -0
- package/skills/apple-notes/create-note.applescript +15 -0
- package/skills/apple-notes/delete-note.applescript +10 -0
- package/skills/apple-notes/edit-note.applescript +10 -0
- package/skills/apple-notes/read-note.applescript +28 -0
- package/skills/apple-notes/references/read.md +65 -0
- package/skills/apple-notes/references/write.md +105 -0
- package/skills/apple-notes/search-notes.applescript +21 -0
- package/skills/apple-reminders/SKILL.md +129 -0
- package/skills/apple-reminders/cli.schema.json +201 -0
- package/skills/apple-reminders/references/edit.md +69 -0
- package/skills/apple-reminders/references/view.md +58 -0
- package/skills/asana/SKILL.md +59 -0
- package/skills/diagrams/SKILL.md +107 -0
- package/skills/diagrams/references/class.md +29 -0
- package/skills/diagrams/references/er.md +27 -0
- package/skills/diagrams/references/flowchart.md +33 -0
- package/skills/diagrams/references/gantt.md +38 -0
- package/skills/diagrams/references/mindmap.md +35 -0
- package/skills/diagrams/references/pie.md +27 -0
- package/skills/diagrams/references/sequence.md +32 -0
- package/skills/diagrams/references/state.md +30 -0
- package/skills/diagrams/references/timeline.md +28 -0
- package/skills/excel/SKILL.md +120 -0
- package/skills/excel/references/create.md +374 -0
- package/skills/excel/references/edit.md +353 -0
- package/skills/excel/references/read.md +99 -0
- package/skills/github/SKILL.md +42 -0
- package/skills/gmail/SKILL.md +142 -0
- package/skills/gmail/operations.json +71 -0
- package/skills/google-calendar/SKILL.md +139 -0
- package/skills/google-calendar/operations.json +62 -0
- package/skills/google-docs/SKILL.md +74 -0
- package/skills/google-docs/operations.json +61 -0
- package/skills/google-docs/references/create.md +97 -0
- package/skills/google-docs/references/edit.md +146 -0
- package/skills/google-docs/references/read.md +49 -0
- package/skills/google-drive/SKILL.md +118 -0
- package/skills/google-drive/operations.json +40 -0
- package/skills/google-sheets/SKILL.md +71 -0
- package/skills/google-sheets/operations.json +85 -0
- package/skills/google-sheets/references/create.md +54 -0
- package/skills/google-sheets/references/edit.md +124 -0
- package/skills/google-sheets/references/read.md +74 -0
- package/skills/image-generation/SKILL.md +48 -0
- package/skills/music-generation/SKILL.md +76 -0
- package/skills/notion/SKILL.md +61 -0
- package/skills/notion/operations.json +53 -0
- package/skills/notion/references/comments.md +65 -0
- package/skills/notion/references/databases.md +68 -0
- package/skills/notion/references/pages.md +119 -0
- package/skills/notion/references/tasks.md +28 -0
- package/skills/obsidian/SKILL.md +122 -0
- package/skills/obsidian/cli.schema.json +392 -0
- package/skills/obsidian/references/read.md +79 -0
- package/skills/obsidian/references/write.md +67 -0
- package/skills/pdf/SKILL.md +110 -0
- package/skills/pdf/references/create.md +169 -0
- package/skills/pdf/references/transform.md +270 -0
- package/skills/pdf/scripts/decrypt.py +26 -0
- package/skills/pdf/scripts/encrypt.py +25 -0
- package/skills/pdf/scripts/extract_text.py +25 -0
- package/skills/pdf/scripts/merge.py +21 -0
- package/skills/pdf/scripts/rotate.py +27 -0
- package/skills/presentations/SKILL.md +118 -0
- package/skills/presentations/references/create.md +399 -0
- package/skills/presentations/references/edit.md +314 -0
- package/skills/presentations/references/read.md +127 -0
- package/skills/spotify/SKILL.md +86 -0
- package/skills/weather/SKILL.md +33 -0
- package/skills/word/SKILL.md +141 -0
- package/skills/word/references/create.md +368 -0
- package/skills/word/references/edit.md +704 -0
- package/skills/word/references/read.md +141 -0
- package/skills/word/references/replace.md +86 -0
- package/skills/word/scripts/list_paragraphs.py +19 -0
- package/skills/word/scripts/replace_paragraphs.py +58 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: music-generation
|
|
3
|
+
description: Create original music from an idea, mood, scene, or lyrics. Make complete tracks, with instrumentals, vocals and variations in any music style.
|
|
4
|
+
tools: [generate_music]
|
|
5
|
+
platform: [darwin, linux, win32]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Music generation
|
|
9
|
+
|
|
10
|
+
Call `generate_music` when the user asks for a song, track, beat, melody,
|
|
11
|
+
jingle, background music, or any generated audio. The result is saved as a chat
|
|
12
|
+
attachment and played to the user automatically — never describe waveforms,
|
|
13
|
+
paste data, or apologize about being text-only; just confirm what you generated.
|
|
14
|
+
Match your description to the tool result's `instrumental` flag: never tell the
|
|
15
|
+
user a track has vocals when it came back instrumental.
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"prompt": "lo-fi hip hop, mellow piano, soft drums, warm bass",
|
|
20
|
+
"title": "midnight study session"
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Instrumental or sung
|
|
25
|
+
|
|
26
|
+
Vocals come from the `lyrics` argument. It is the only switch that makes the
|
|
27
|
+
model sing: a voice cue in the `prompt` (e.g. "male vocals") only sets the voice
|
|
28
|
+
timbre, and with no `lyrics` the track is always instrumental, whatever the
|
|
29
|
+
prompt says.
|
|
30
|
+
|
|
31
|
+
- **Instrumental, background music, or a beat with no singing**: omit `lyrics`
|
|
32
|
+
entirely. That produces an instrumental (the model's default).
|
|
33
|
+
- **A song with singing, vocals, or words**: you must pass `lyrics`, structured
|
|
34
|
+
with `[verse]` / `[chorus]` tags. Name who sings with a tag in the `prompt`
|
|
35
|
+
(`male vocal`, `female vocal`, or for a duet `male and female duet, harmonized
|
|
36
|
+
vocals`) to set the voice, and set `vocalLanguage` when the user names a
|
|
37
|
+
language.
|
|
38
|
+
- **The user wants singing but gave no words**: write short `[verse]` /
|
|
39
|
+
`[chorus]` lyrics yourself from their topic and pass them as `lyrics`. Never
|
|
40
|
+
leave `lyrics` empty for a sung request, or the track comes out instrumental.
|
|
41
|
+
|
|
42
|
+
Set `duration` when the user asks for a specific length ("30 seconds", "a
|
|
43
|
+
two-minute track"); otherwise leave it unset and let the model choose.
|
|
44
|
+
|
|
45
|
+
## Parameters
|
|
46
|
+
|
|
47
|
+
- `prompt` (required) - describe the genre, instruments, mood, and vocal
|
|
48
|
+
arrangement in plain language. It is the caption ACE-Step reads for the sound
|
|
49
|
+
and the voice timbre, so name who sings here; the singing itself still needs
|
|
50
|
+
`lyrics` (see "Instrumental or sung").
|
|
51
|
+
- `title` — a short, descriptive song title (2 to 5 words) used to name the
|
|
52
|
+
saved audio file. Set it whenever you generate a track so the download has a
|
|
53
|
+
human-readable name; keep it plain and omit any file extension. Without it the
|
|
54
|
+
file falls back to a slug of the `prompt`.
|
|
55
|
+
- `lyrics` - the sung words, and the switch that turns vocals on. Omit for an
|
|
56
|
+
instrumental (the default). Structure them with `[verse]` / `[chorus]` tags. A
|
|
57
|
+
voice cue in the `prompt` alone does not sing; vocals need `lyrics` here.
|
|
58
|
+
- `vocalLanguage` — the language the vocals are sung in, as a short code
|
|
59
|
+
(`en`, `es`, `de`, `it`, …). Set it when the user names a language; it only
|
|
60
|
+
applies with lyrics and defaults to English.
|
|
61
|
+
- `duration` — approximate length in seconds. Leave unset to let the model
|
|
62
|
+
choose; set it only when the user asks for a specific length. The model rounds
|
|
63
|
+
to its own frame grid, so the clip may be slightly shorter or longer.
|
|
64
|
+
- `seed` — set only when the user wants a reproducible or slightly varied retry
|
|
65
|
+
of a previous result; `-1` or omitted is random.
|
|
66
|
+
- `bpm` — tempo in beats per minute; set it when the user names a tempo.
|
|
67
|
+
- `keyscale` — musical key and scale (e.g. `C minor`, `A major`), when named.
|
|
68
|
+
- `timesignature` — meter (e.g. `4/4`, `3/4`), when the user names one.
|
|
69
|
+
|
|
70
|
+
## Notes
|
|
71
|
+
|
|
72
|
+
- Generation takes a while; the result arrives as an attachment in this turn.
|
|
73
|
+
- One generation at a time — if the tool reports it is busy, wait and retry
|
|
74
|
+
instead of stacking calls.
|
|
75
|
+
- The first use downloads several gigabytes of model weights; that happens once,
|
|
76
|
+
before the first track is produced.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: notion
|
|
3
|
+
description: Notion pages, databases, and blocks — search, read, create, update, and comment via the official Notion MCP server.
|
|
4
|
+
tools: [mcp_call, notion_create_page, notion_insert_content]
|
|
5
|
+
platform: [darwin, linux, win32, ios, android]
|
|
6
|
+
credentials: [notion_mcp_access_token]
|
|
7
|
+
allow_list: [https://mcp.notion.com/mcp]
|
|
8
|
+
mcp_reads:
|
|
9
|
+
[
|
|
10
|
+
notion-search,
|
|
11
|
+
notion-fetch,
|
|
12
|
+
notion-get-comments,
|
|
13
|
+
notion-get-teams,
|
|
14
|
+
notion-get-users,
|
|
15
|
+
notion-get-async-task,
|
|
16
|
+
notion-query-data-sources
|
|
17
|
+
]
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# Notion
|
|
21
|
+
|
|
22
|
+
Two typed tools cover the most common writes and are called directly, like `skill`: `notion_create_page` creates a page and `notion_insert_content` adds text to one. Everything else is one `mcp_call` against `https://mcp.notion.com/mcp` with the **tool name as `method`** and its **args as `params`** — the JSON-RPC envelope, session handshake, and bearer token are handled for you. Do **not** build a `{name, arguments}` envelope, pass a `sessionId`, or call `initialize`/`notifications/initialized`/`tools/list`.
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"url": "https://mcp.notion.com/mcp",
|
|
27
|
+
"method": "notion-search",
|
|
28
|
+
"params": { "query": "Q4 roadmap", "page_size": 5 }
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Rules that hold for every call:
|
|
33
|
+
|
|
34
|
+
- `params` is a JSON object, never a string.
|
|
35
|
+
- Page, database, and view ids come from a URL the user gave or from a previous result — never invented.
|
|
36
|
+
- A page title is always a plain string: `"properties": { "title": "The title" }` when creating several pages or renaming one.
|
|
37
|
+
- Deleting or archiving a page is not possible through this connection — say so instead of improvising (details in `references/pages.md`).
|
|
38
|
+
- A `401` status means Notion isn't connected — tell the user to connect "Notion" from the skill's setup; do not drive OAuth yourself. An "object not found" / no-access error means the connection can't see that object — tell the user to share the page or database with the Notion connection.
|
|
39
|
+
|
|
40
|
+
## Finding pages
|
|
41
|
+
|
|
42
|
+
There is no "list all" — `notion-search` is the entry point and `query` is required (min length 1). For a broad overview pass a keyword from the request, and always bound results with a small `page_size`. Each result carries `title`, `url`, and `id`. Results are ranked by semantic similarity, not by title — when one result's title matches the requested name (case-insensitive), take that one even if it isn't first. When the user named a specific page and no title matches, list the candidates as `[title](url)` and ask instead of guessing. Search once per request; do not re-run it with variations.
|
|
43
|
+
|
|
44
|
+
`notion-search` knows nothing about the connected identity — for "who am I" / "which workspace" call `notion-fetch` with `id: "self"` (see `references/pages.md`).
|
|
45
|
+
|
|
46
|
+
## Load the Recipe File First
|
|
47
|
+
|
|
48
|
+
This file carries no other calls. The tool tables and working calls live in four reference files — load the one for the job with the `skill` tool BEFORE calling a Notion tool, then copy its call and change only the values. Each load is a real `skill` tool call — printing the call as JSON or text in your reply loads nothing.
|
|
49
|
+
|
|
50
|
+
- **Pages** — read or summarize a page, "who am I / which workspace", create a page, add / change / replace text, rename or set a property, delete / archive (and why it cannot), move, duplicate: call the `skill` tool with `name: "notion"` and `file: "references/pages.md"`.
|
|
51
|
+
- **Databases, data sources and views** — create a database, add a row, read a database's schema, query or filter rows, create or change a view: call the `skill` tool with `name: "notion"` and `file: "references/databases.md"`.
|
|
52
|
+
- **Comments** (also people and teamspaces) — read or add a comment, list workspace members, look up a user, list teamspaces: call the `skill` tool with `name: "notion"` and `file: "references/comments.md"`.
|
|
53
|
+
- **Async tasks** — a result carried a `task_id`, or the user asks whether a duplicate / large write finished: call the `skill` tool with `name: "notion"` and `file: "references/tasks.md"`.
|
|
54
|
+
|
|
55
|
+
Never write a call from memory. Each tool's arguments have one exact shape (`command` + its single companion field, `data.mode` + its fields) and the server rejects anything else; loading the file is one cheap read-only call. After the file is loaded, your next output is the tool call — no further loads.
|
|
56
|
+
|
|
57
|
+
## Output
|
|
58
|
+
|
|
59
|
+
- Show page titles and IDs together. When a result carries a `url`, render the title as a Markdown link — `[title](url)` — never bare or in backticks, or it won't be clickable.
|
|
60
|
+
- For query results, lead with counts/rollups if present, then rows — don't dump the raw structured response. Surface user-visible property names, not IDs.
|
|
61
|
+
- If a query tool responds with an upgrade prompt, tell the user their plan doesn't support it (single-source needs Business+Notion AI, multi-source needs Enterprise+Notion AI) — don't retry.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"operations": [
|
|
3
|
+
{
|
|
4
|
+
"tool": "notion_create_page",
|
|
5
|
+
"description": "Create one Notion page with a title and optional Markdown body, under a parent page or database. One user request means one call; never recreate a page to make sure it landed.",
|
|
6
|
+
"parameters": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"title": { "type": "string", "description": "Exact title from the user" },
|
|
10
|
+
"content": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Page body in Notion-flavored Markdown; do not repeat the title"
|
|
13
|
+
},
|
|
14
|
+
"parentPageId": { "type": "string", "description": "Parent page id or URL" },
|
|
15
|
+
"parentDatabaseId": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"description": "Parent database id or URL, for a database row"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"required": ["title"]
|
|
21
|
+
},
|
|
22
|
+
"request": {
|
|
23
|
+
"transport": "mcp",
|
|
24
|
+
"method": "notion-create-pages",
|
|
25
|
+
"url": "https://mcp.notion.com/mcp",
|
|
26
|
+
"builder": "notion-create-page"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"tool": "notion_insert_content",
|
|
31
|
+
"description": "Add Markdown text to an existing Notion page, at the end by default or at the start. For changing text that is already there use notion-update-page with update_content via mcp_call.",
|
|
32
|
+
"parameters": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"properties": {
|
|
35
|
+
"pageId": { "type": "string", "description": "Page id or URL" },
|
|
36
|
+
"content": { "type": "string", "description": "Markdown to add" },
|
|
37
|
+
"position": {
|
|
38
|
+
"type": "string",
|
|
39
|
+
"enum": ["start", "end"],
|
|
40
|
+
"description": "Defaults to end"
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"required": ["pageId", "content"]
|
|
44
|
+
},
|
|
45
|
+
"request": {
|
|
46
|
+
"transport": "mcp",
|
|
47
|
+
"method": "notion-update-page",
|
|
48
|
+
"url": "https://mcp.notion.com/mcp",
|
|
49
|
+
"builder": "notion-insert-content"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Notion Comments, People and Teamspaces
|
|
2
|
+
|
|
3
|
+
Every call is one `mcp_call` with `url: "https://mcp.notion.com/mcp"`, the tool name as `method`, and its args as `params` (a JSON object, never a string). Call these tools directly — no `tools/list`.
|
|
4
|
+
|
|
5
|
+
| tool | required args | use for |
|
|
6
|
+
| ----------------------- | ----------------------------- | ------------------------------------------- |
|
|
7
|
+
| `notion-get-comments` | `page_id` | read a page's comments and discussions |
|
|
8
|
+
| `notion-create-comment` | `page_id`, `rich_text` | comment on a page |
|
|
9
|
+
| `notion-get-users` | — (optional `id` or `"self"`) | list workspace members, or look up one user |
|
|
10
|
+
| `notion-get-teams` | — | list teamspaces |
|
|
11
|
+
|
|
12
|
+
## Reading comments
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"url": "https://mcp.notion.com/mcp",
|
|
17
|
+
"method": "notion-get-comments",
|
|
18
|
+
"params": { "page_id": "<page id or URL>" }
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
The result includes block-level and resolved threads. Report each comment with its author and text; a read-only question ends after the read.
|
|
23
|
+
|
|
24
|
+
## Adding a comment
|
|
25
|
+
|
|
26
|
+
The comment text goes in `rich_text` as one text object:
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"url": "https://mcp.notion.com/mcp",
|
|
31
|
+
"method": "notion-create-comment",
|
|
32
|
+
"params": {
|
|
33
|
+
"page_id": "<page id or URL>",
|
|
34
|
+
"rich_text": [{ "text": { "content": "The comment" } }]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
One user request → one comment. After the result, say the comment was added and link the page.
|
|
40
|
+
|
|
41
|
+
## People
|
|
42
|
+
|
|
43
|
+
`notion-get-users` with `params: {}` lists workspace members and guests (id, name, email, type). Pass `"id": "self"` for the connected user, or a user id to look one up:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{ "url": "https://mcp.notion.com/mcp", "method": "notion-get-users", "params": {} }
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
For "who am I / which workspace" prefer `notion-fetch` with `"id": "self"` (see `references/pages.md`) — it also names the workspace.
|
|
50
|
+
|
|
51
|
+
## Teamspaces
|
|
52
|
+
|
|
53
|
+
```json
|
|
54
|
+
{ "url": "https://mcp.notion.com/mcp", "method": "notion-get-teams", "params": {} }
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Lists the teamspaces and whether the connected user is a member of each.
|
|
58
|
+
|
|
59
|
+
## Output
|
|
60
|
+
|
|
61
|
+
Show people by name (and email when present), pages as `[title](url)` links. Never invent a user id — take it from `notion-get-users`.
|
|
62
|
+
|
|
63
|
+
## Now act
|
|
64
|
+
|
|
65
|
+
Your next output is the tool call (or, after the result, the reply) — no further skill loads.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Notion Databases, Data Sources and Views
|
|
2
|
+
|
|
3
|
+
A database holds one or more **data sources** (the typed schema behind it) and **views** over them. Every call is one `mcp_call` with `url: "https://mcp.notion.com/mcp"`, the tool name as `method`, and its args as `params` (a JSON object, never a string). Call these tools directly — no `tools/list`.
|
|
4
|
+
|
|
5
|
+
| tool | required args | use for |
|
|
6
|
+
| --------------------------- | ---------------------------------------- | ------------------------------------------------------------------------ |
|
|
7
|
+
| `notion-fetch` | `id` (database / data-source / view URL) | read the schema, the `collection://` data-source URLs, and the view URLs |
|
|
8
|
+
| `notion-query-data-sources` | `data` (`mode` + its fields) | run a database view, or query rows by SQL |
|
|
9
|
+
| `notion_create_page` | `title`, `parentDatabaseId` | add one row to a database (typed tool — no `params`) |
|
|
10
|
+
| `notion-create-database` | properties for the new database | create a database + its initial data source + view |
|
|
11
|
+
| `notion-update-data-source` | `data_source_id` + fields | rename a data source or edit its properties |
|
|
12
|
+
| `notion-create-view` | `data_source_id`, `name`, `type` | add a table / board / list / calendar / timeline / gallery view |
|
|
13
|
+
| `notion-update-view` | `view_id` + fields | edit a view's name, filters, sorts, or display |
|
|
14
|
+
|
|
15
|
+
## Reading a database
|
|
16
|
+
|
|
17
|
+
Fetch the database first: the result carries the schema, each data source's `collection://<id>` URL (used as the SQL table name), and each view's URL (the one carrying `?v=<view-id>`).
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"url": "https://mcp.notion.com/mcp",
|
|
22
|
+
"method": "notion-fetch",
|
|
23
|
+
"params": { "id": "<database id or URL>" }
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Querying rows
|
|
28
|
+
|
|
29
|
+
`notion-query-data-sources` nests every argument under `data`, and the two modes take different fields — send the wrong one and the server rejects the call:
|
|
30
|
+
|
|
31
|
+
| `mode` | carries | for |
|
|
32
|
+
| --------------- | ---------------------------- | ------------------------------------------- |
|
|
33
|
+
| `view` | `view_url` | run a database view's own filters and sorts |
|
|
34
|
+
| `sql` (default) | `data_source_urls` + `query` | filter, group or aggregate rows yourself |
|
|
35
|
+
|
|
36
|
+
View mode works on every plan, so start there:
|
|
37
|
+
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"url": "https://mcp.notion.com/mcp",
|
|
41
|
+
"method": "notion-query-data-sources",
|
|
42
|
+
"params": { "data": { "mode": "view", "view_url": "<database url including ?v=>" } }
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
SQL mode is plan-gated: `data_source_urls` lists the `collection://` URLs and `query` is SQLite using them as table names. If the response is an upgrade prompt, tell the user their plan doesn't support it (single-source needs Business+Notion AI, multi-source needs Enterprise+Notion AI) — don't retry.
|
|
47
|
+
|
|
48
|
+
## Adding a row
|
|
49
|
+
|
|
50
|
+
A row is a page whose parent is the database. Use `notion_create_page` with `parentDatabaseId`; the `title` fills the title property and `content` becomes the row's page body:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{ "title": "Row title", "content": "Optional body", "parentDatabaseId": "<database id or URL>" }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Set other properties afterwards with `notion-update-page` → `update_properties` (see `references/pages.md`).
|
|
57
|
+
|
|
58
|
+
## Creating and changing structure
|
|
59
|
+
|
|
60
|
+
`notion-create-database` creates the database with its first data source and view; `notion-update-data-source` renames a data source or changes its properties; `notion-create-view` / `notion-update-view` manage views. Take the `data_source_id` and `view_id` from a `notion-fetch` of the database — never guess them. If the server rejects the call, quote its message and ask the user how to proceed instead of retrying with invented fields.
|
|
61
|
+
|
|
62
|
+
## Output
|
|
63
|
+
|
|
64
|
+
Lead with counts and rollups when present, then rows; surface user-visible property names, not IDs. Show the database as a `[title](url)` link.
|
|
65
|
+
|
|
66
|
+
## Now act
|
|
67
|
+
|
|
68
|
+
Your next output is the tool call (or, after the result, the reply) — no further skill loads.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# Notion Pages
|
|
2
|
+
|
|
3
|
+
Create with `notion_create_page`, add text with `notion_insert_content`; every other call is one `mcp_call` with `url: "https://mcp.notion.com/mcp"`, the tool name as `method`, and its args as `params` (a JSON object, never a string). Call these tools directly — no `tools/list`.
|
|
4
|
+
|
|
5
|
+
| tool | required args | use for |
|
|
6
|
+
| ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------- |
|
|
7
|
+
| `notion-fetch` | `id` (page URL or ID, or `"self"`) | read a page's properties + content, or the connection identity |
|
|
8
|
+
| `notion_create_page` | `title`; optional `content`, `parentPageId` | create one page (typed tool — no `params`) |
|
|
9
|
+
| `notion-create-pages` | `pages` | create several pages in one request; `allow_async: true` for very large content |
|
|
10
|
+
| `notion_insert_content` | `pageId`, `content`; optional `position` | add text to a page (typed tool — no `params`) |
|
|
11
|
+
| `notion-update-page` | `page_id`, `command`, + its one companion field | change text, rename, set a property, icon, cover |
|
|
12
|
+
| `notion-move-pages` | `page_or_database_ids`, `new_parent` | reparent pages or databases |
|
|
13
|
+
| `notion-duplicate-page` | `page_id` | duplicate a page — always async, poll the returned task (`references/tasks.md`) |
|
|
14
|
+
|
|
15
|
+
Comments are not a page command: to read or add a comment, load `references/comments.md` and use `notion-create-comment` / `notion-get-comments`.
|
|
16
|
+
|
|
17
|
+
## Reading a page
|
|
18
|
+
|
|
19
|
+
`notion-fetch` returns the page's properties and its content as Markdown. Always name the page you read (title + link) when reporting its content. A read-only question ends after the read — never follow it with a write.
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"url": "https://mcp.notion.com/mcp",
|
|
24
|
+
"method": "notion-fetch",
|
|
25
|
+
"params": { "id": "<page id or URL>" }
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
For "who am I" / "which workspace", the same call with `"id": "self"` is the fixed one-call answer — never loop on search for it.
|
|
30
|
+
|
|
31
|
+
## Creating a page
|
|
32
|
+
|
|
33
|
+
One user request → one create. `notion_create_page` is a tool of its own, listed beside `mcp_call` — call it directly with these arguments (it is not a `method` for `mcp_call`, and it takes no `url` or `params`):
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{ "title": "Exact title from the user", "content": "The page body" }
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
`title` is the exact title from the user; `content` is optional Markdown (do not repeat the title in the body). For a private standalone page send only those two fields — no parent field at all. Add `"parentPageId": "<page id or URL>"` only when the user named a parent page, or `"parentDatabaseId"` for a database row.
|
|
40
|
+
|
|
41
|
+
Use `notion-create-pages` through `mcp_call` only when one request asks for several pages. Each entry uses `properties.title` — a plain string — plus optional `content`; leave `parent` out for standalone pages and add `"parent": { "page_id": "<id>" }` beside `pages` only when the user named one:
|
|
42
|
+
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"url": "https://mcp.notion.com/mcp",
|
|
46
|
+
"method": "notion-create-pages",
|
|
47
|
+
"params": {
|
|
48
|
+
"pages": [
|
|
49
|
+
{ "properties": { "title": "First title" }, "content": "First body" },
|
|
50
|
+
{ "properties": { "title": "Second title" }, "content": "Second body" }
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
One user request → one `notion-create-pages` write unless they asked for several pages in that request. Never recreate a page to "make sure", to fill an empty wrap-up, or because a previous call timed out. After a confirmed create, show the title as a Markdown link from the result `url` and keep the result `id` for follow-up edits. To verify, `notion-search` / `notion-fetch` — do not write again. If create times out or returns an uncertain result: search for the **exact title**, then fetch any title match. Only create again if no exact-title page exists.
|
|
57
|
+
|
|
58
|
+
## Adding text
|
|
59
|
+
|
|
60
|
+
`notion_insert_content` is also a tool of its own — call it directly. It appends by default; `"position": "start"` prepends. It sends `"command": "insert_content"` to `notion-update-page` for you, so never call that command through `mcp_call`.
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{ "pageId": "<page id or URL>", "content": "The line to add" }
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Changing a page
|
|
67
|
+
|
|
68
|
+
`notion-update-page` always takes `page_id` and `command`. Each command carries **its own one extra field** — send a different one and the server rejects the call, so pick the row before writing:
|
|
69
|
+
|
|
70
|
+
| `command` | carries | for |
|
|
71
|
+
| --------------------- | --------------------- | ------------------------------------ |
|
|
72
|
+
| `update_content` | `content_updates` | change part of the body |
|
|
73
|
+
| `replace_content` | `new_str` | overwrite the whole body |
|
|
74
|
+
| `update_properties` | `properties` | title, status, any database property |
|
|
75
|
+
| `apply_template` | `template_id` | apply a database template |
|
|
76
|
+
| `update_verification` | `verification_status` | mark a page verified |
|
|
77
|
+
|
|
78
|
+
Rename = `update_properties` with the new title as a plain string:
|
|
79
|
+
|
|
80
|
+
```json
|
|
81
|
+
{
|
|
82
|
+
"url": "https://mcp.notion.com/mcp",
|
|
83
|
+
"method": "notion-update-page",
|
|
84
|
+
"params": {
|
|
85
|
+
"page_id": "<page id or URL>",
|
|
86
|
+
"command": "update_properties",
|
|
87
|
+
"properties": { "title": "New title" }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Reserve `update_content` for changing text that is already there: its `content_updates` is an array of `{ "old_str", "new_str" }` pairs, `old_str` must match the page exactly, so `notion-fetch` first. `update_content` has no top-level `new_str`. `new_str` is a Markdown string, never an array. Icon and cover can be set alongside any command.
|
|
93
|
+
|
|
94
|
+
## Archiving (deleting) a page
|
|
95
|
+
|
|
96
|
+
This connection cannot move a page to Trash: `notion-update-page` rejects `in_trash`, and there is no delete tool. When the user asks to delete, remove or archive a page, make no tool call — reply that the page has to be deleted in Notion itself (open the page, `•••` menu, **Move to Trash**) and link it. Never empty the page, overwrite its body, rename it or move it as a substitute for deleting it.
|
|
97
|
+
|
|
98
|
+
## Moving and duplicating
|
|
99
|
+
|
|
100
|
+
```json
|
|
101
|
+
{
|
|
102
|
+
"url": "https://mcp.notion.com/mcp",
|
|
103
|
+
"method": "notion-move-pages",
|
|
104
|
+
"params": {
|
|
105
|
+
"page_or_database_ids": ["<page id>"],
|
|
106
|
+
"new_parent": { "page_id": "<new parent id>" }
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
`new_parent` is `{ "page_id": … }`, `{ "database_id": … }`, or `{ "data_source_id": … }`. `notion-duplicate-page` takes `page_id` and returns a `task_id`, not the copy — load `references/tasks.md` to poll it before telling the user it is done.
|
|
112
|
+
|
|
113
|
+
## Output
|
|
114
|
+
|
|
115
|
+
After a write, show the page as a `[title](url)` link and say what changed. After a read, report the content under the page's title and link.
|
|
116
|
+
|
|
117
|
+
## Now act
|
|
118
|
+
|
|
119
|
+
Your next output is the tool call (or, after the result, the reply) — no further skill loads.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Notion Async Tasks
|
|
2
|
+
|
|
3
|
+
Some writes do not finish inside the call. The response then carries a `task_id`, not the final result — poll it, and don't tell the user it's done until the status is `succeeded`. Every call is one `mcp_call` with `url: "https://mcp.notion.com/mcp"`, the tool name as `method`, and its args as `params` (a JSON object, never a string).
|
|
4
|
+
|
|
5
|
+
| tool | required args | use for |
|
|
6
|
+
| ----------------------- | ------------- | ------------------------------- |
|
|
7
|
+
| `notion-get-async-task` | `task_id` | poll an async operation's state |
|
|
8
|
+
|
|
9
|
+
Which calls go async:
|
|
10
|
+
|
|
11
|
+
- `notion-duplicate-page` — always.
|
|
12
|
+
- `notion-create-pages` and `notion-update-page` — when sent with `"allow_async": true` (use it only for very large content).
|
|
13
|
+
|
|
14
|
+
## Polling
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
{
|
|
18
|
+
"url": "https://mcp.notion.com/mcp",
|
|
19
|
+
"method": "notion-get-async-task",
|
|
20
|
+
"params": { "task_id": "<task_id from the prior response>" }
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Status is `queued`, `running`, `retrying`, `succeeded`, or `failed`. Respect the suggested backoff in the response before polling again; poll at most a few times, then tell the user it is still running and how to check later. On `succeeded`, report the result it carries (for a duplicate, the new page's title as a `[title](url)` link). On `failed`, quote the error and stop — do not retry the original write.
|
|
25
|
+
|
|
26
|
+
## Now act
|
|
27
|
+
|
|
28
|
+
Your next output is the tool call (or, after the result, the reply) — no further skill loads.
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: obsidian
|
|
3
|
+
description: Manage local Obsidian vault notes through the registered Obsidian CLI. Search, read, create, append, rename, move, inspect backlinks, list tasks, and work with daily notes.
|
|
4
|
+
tools: [exec(obsidian)]
|
|
5
|
+
platform: [darwin, linux, win32]
|
|
6
|
+
metadata:
|
|
7
|
+
{
|
|
8
|
+
"openclaw":
|
|
9
|
+
{
|
|
10
|
+
"requires":
|
|
11
|
+
{
|
|
12
|
+
"bins": ["obsidian"],
|
|
13
|
+
"binMinVersions": { "obsidian": { "min": "1.12.7", "command": "obsidian version" } }
|
|
14
|
+
},
|
|
15
|
+
"setup":
|
|
16
|
+
{
|
|
17
|
+
"summary": "Obsidian works through the official Obsidian CLI connected to the running desktop app. You can instead select a vault folder for direct Markdown file access; app-only actions need the CLI. Workbench opens Obsidian on demand when using the CLI.",
|
|
18
|
+
"routes":
|
|
19
|
+
[
|
|
20
|
+
{
|
|
21
|
+
"kind": "instructions",
|
|
22
|
+
"label": "Register the Obsidian CLI",
|
|
23
|
+
"description": "Requires Obsidian 1.12.7 or newer with the command line interface registered. Keep the app installed; Workbench opens it on demand.",
|
|
24
|
+
"helpUrl": "https://help.obsidian.md/cli",
|
|
25
|
+
"steps":
|
|
26
|
+
[
|
|
27
|
+
"Open the Obsidian desktop app and update it to 1.12.7 or newer.",
|
|
28
|
+
"Go to Settings → General → Advanced and enable Command line interface.",
|
|
29
|
+
"Click Register CLI to add it to your PATH.",
|
|
30
|
+
"Reopen this Skills page."
|
|
31
|
+
]
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"kind": "picker",
|
|
35
|
+
"label": "Select vault folder",
|
|
36
|
+
"provider": "obsidian",
|
|
37
|
+
"description": "Choose a folder that contains a .obsidian config directory. Switches to vault file mode (no running app required).",
|
|
38
|
+
"credentialKey": "obsidian_vault_path"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
# Obsidian
|
|
47
|
+
|
|
48
|
+
Work with a local Obsidian vault through the `obsidian` CLI. The CLI is a local
|
|
49
|
+
controller for the running Obsidian desktop app and can search, read, create,
|
|
50
|
+
append, rename, move, open, and manage notes inside known vaults.
|
|
51
|
+
|
|
52
|
+
## Load the Recipe File First
|
|
53
|
+
|
|
54
|
+
This file carries no commands. The working commands live in two reference files
|
|
55
|
+
— load the one for the job with the `skill` tool BEFORE calling `exec`, then
|
|
56
|
+
copy its command and change only the arguments:
|
|
57
|
+
|
|
58
|
+
Each load is a real `skill` tool call — printing the call as JSON or text in
|
|
59
|
+
your reply loads nothing.
|
|
60
|
+
|
|
61
|
+
- **Finding and reading notes** — "what are my notes", "list notes in X",
|
|
62
|
+
"find / search notes about X", "read / open / summarize note X", "what's in
|
|
63
|
+
my daily note", "list my tags", backlinks, tasks: call the `skill` tool with
|
|
64
|
+
`name: "obsidian"` and `file: "references/read.md"`.
|
|
65
|
+
- **Changing notes** — "create a note", "add to note X", "prepend", "add to
|
|
66
|
+
my daily note", rename, move, delete: call the `skill` tool with
|
|
67
|
+
`name: "obsidian"` and `file: "references/write.md"`.
|
|
68
|
+
|
|
69
|
+
Most requests are ONE command. Run that single command, then answer from its
|
|
70
|
+
output. Do NOT run `obsidian vault info` first unless the vault is ambiguous.
|
|
71
|
+
|
|
72
|
+
## Always Use the obsidian CLI — Never Shell Out
|
|
73
|
+
|
|
74
|
+
The vault is managed by Obsidian. ALWAYS read, list, search, and edit notes with
|
|
75
|
+
`obsidian` commands via the `exec` tool. NEVER use `cat`, `ls`, `find`, `grep`,
|
|
76
|
+
`head`, `tail`, `echo`, output redirection, or filesystem paths under the vault
|
|
77
|
+
directory — those bypass Obsidian and are wrong even when they appear to work.
|
|
78
|
+
If an `obsidian` command fails, correct its arguments and retry the `obsidian`
|
|
79
|
+
command; do not switch to shell or file tools. Use `exec` only, one `obsidian`
|
|
80
|
+
command per call. Do not chain with `&&`, `;`, or pipes.
|
|
81
|
+
|
|
82
|
+
## When to Use
|
|
83
|
+
|
|
84
|
+
- The user asks to search, read, summarize, create, append, rename, move, or
|
|
85
|
+
delete notes in Obsidian.
|
|
86
|
+
- The user asks about daily notes, tags, backlinks, aliases, properties, tasks,
|
|
87
|
+
templates, bookmarks, or vault structure.
|
|
88
|
+
- The user refers to "my vault", "my notes", "daily note", "Obsidian",
|
|
89
|
+
wikilinks, or Markdown notes managed by Obsidian.
|
|
90
|
+
|
|
91
|
+
## When NOT to Use
|
|
92
|
+
|
|
93
|
+
- General filesystem work outside Obsidian.
|
|
94
|
+
- Remote note providers such as Notion, Google Drive, Apple Notes, or cloud
|
|
95
|
+
storage.
|
|
96
|
+
- Browser automation, OAuth, MCP, web search, or direct filesystem tools.
|
|
97
|
+
- Plugin installation, theme changes, sync changes, command execution by ID, or
|
|
98
|
+
deletion unless the user explicitly asks for that exact side effect.
|
|
99
|
+
|
|
100
|
+
## Setup and Availability
|
|
101
|
+
|
|
102
|
+
- CLI mode: Obsidian 1.12.7+ with Command line interface registered. Workbench
|
|
103
|
+
launches the app on demand when needed.
|
|
104
|
+
- Vault file mode: Skills page → Obsidian → Select vault folder. Commands run
|
|
105
|
+
against that folder's Markdown files without the running app.
|
|
106
|
+
- Confirm the active vault with `obsidian vault info=name` ONLY when the request
|
|
107
|
+
is ambiguous or multiple vaults exist — not before every request. If the
|
|
108
|
+
request names a specific vault, add `vault="<Vault Name>"`.
|
|
109
|
+
- If no vault is active or the CLI cannot reach Obsidian, ask the user to open
|
|
110
|
+
Obsidian or select a vault folder. A missing vault path is a runtime setup
|
|
111
|
+
question, not a reason to use another tool or python.
|
|
112
|
+
|
|
113
|
+
## Output Policy
|
|
114
|
+
|
|
115
|
+
- Keep results small: note path, matching line, and the minimal relevant
|
|
116
|
+
excerpt. Cite note paths and headings when answering from vault content.
|
|
117
|
+
- After a successful command, finish with a concise visible answer.
|
|
118
|
+
- If a command fails because Obsidian is not running, a vault is missing, or a
|
|
119
|
+
note path is ambiguous, report that clearly and ask for the next specific
|
|
120
|
+
setup step. Never claim a note changed unless the command succeeded.
|
|
121
|
+
- Do not expose full vault dumps, plugin listings, or large note bodies unless
|
|
122
|
+
the user explicitly requests them.
|