apple-notes
Manage Apple Notes on macOS — list, search, read, create, append, move, delete, and export notes, and manage folders.
Skill by acedatacloud
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/acedatacloud-apple-notes
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, frontend, backend, productivity
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/apple-notes
What's inside
- Skill name
apple-notes- Description
- Manage Apple Notes on macOS — list, search, read, create, append, move, delete, and export notes, and manage folders. Use when the user mentions Apple Notes / 备忘录, "add a note", "my notes", searching their notes, organizing folders, or exporting a note to Markdown/HTML. macOS-only; runs locally against Notes.app — no cloud API, no token.
- License
- Apache-2.0
- Compatibility
- macOS-only. No API token, no connector — Apple Notes has no cloud API. Drives the local Notes.app via AppleScript (osascript); zero external dependencies (Python 3 standard library only). Requires granting Automation access to Notes.app on first run. Does not call api.acedata.cloud.
- Metadata
- author: acedatacloud · version: 1.0
- Instructions
- 116 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Files (2)
- SKILL.md
- notes.py · scripts/
SKILL.md (first lines)
# apple-notes — manage Apple Notes locally via AppleScript
Drives the user's **real** Apple Notes through `Notes.app` on macOS. Apple never
shipped a cloud API for Notes, so there is nothing to OAuth into and no token to
inject — this skill runs **on the user's own Mac** and talks to Notes.app with
AppleScript (`osascript`). It works wherever an agent runs on macOS: the
**AceDataCloud desktop app** (which executes local tools / local MCP on the
user's Mac), Claude Code on macOS, or a CodingBridge node on the user's Mac.
> **`surfaces: [mac]`** in the frontmatter marks this skill as **macOS-desktop
> only** — it cannot run on the web / iOS / Android / Windows surfaces (there is
> no local `Notes.app` there). The skill/connector directory UI reads this to
> badge the card ("macOS desktop") and steer users to install it from the macOS
> desktop app. Absent `surfaces`, a skill is assumed available everywhere.
The skill ships [`scripts/notes.py`](scripts/notes.py) — self-contained, Python
**standard library only** (it shells out to `osascript`; no `pip install`, no
`brew`). Dynamic values are passed as environment variables, never interpolated
into the AppleScript source, so note content can't break the script or inject
commands.
## Requirements
- **macOS** with the Notes app. `python3` (system Python is fine).
- **Automation permission.** The first call triggers a macOS prompt: *"Terminal
wants to control Notes."* Approve it, or enable it under **System Settings ›
Privacy & Security › Automation ›** (your terminal / agent) **› Notes**. On an
authorization error the CLI tells the user exactly this — do **not** loop-retry.
- Referencing Notes launches the app in the background (no window is forced open).
```sh
NOTES="${SKILL_DIR:-.}/scripts/notes.py" # run from this skill's directory
python3 "$NOTES" folders # smoke-test the connection
```
## Commands
| Command | Read/Write | Purpose |
| --- | --- | --- |
| `folders` | read | List folders with note counts |
| `list [--folder F] [--limit N]` | read | List notes (newest first): id, title, folder, dates |
| `search QUERY [--folder F] [--limit N]` | read | Case-insensitive substring match on title + body |
| `view NOTE_ID [--format json\|text\|html]` | read | Show one note (metadata + body) |
| `export NOTE_ID [--format md\|html\|text] [-o FILE]` | read | Export one note to Markdown/HTML/text |
| `create --title T [--body B \| --body-file F] [--folder F]` | **write** | Create a note |
| `append NOTE_ID [--body B \| --body-file F]` | **write** | Append text to an existing note |
| `move NOTE_ID --folder F` | **write** | Move a note to another folder |
| `new-folder NAME` | **write** | Create a folder |
| `delete NOTE_ID` | **write** | Move a note to *Recently Deleted* (recoverable) |
Most commands print JSON (and errors are always JSON: `{"error": ...}`). The
exceptions print raw note content to stdout: `view --format text|html` and
`export` without `-o`. `NOTE_ID` is the opaque `x-coredata://…` id returned by
`list` / `search` — always fetch a fresh id first; do not guess one.
## Read examples
```sh
python3 "$NOTES" folders
python3 "$NOTES" list --limit 20
python3 "$NOTES" list --folder "Work" --limit 50
python3 "$NOTES" search "invoice" --limit 20
python3 "$NOTES" view "x-coredata://…/p42"
python3 "$NOTES" export "x-coredata://…/p42" --format md -o note.md
```
## Writes are GATED (dry-run unless trailing `--confirm`)
`create`, `append`, `move`, `new-folder`, and `delete` change the user's real
notes. Without a trailing `--confirm` they **dry-run** and print what they would
do. `--confirm` is honored **only as the very last argument**. Always show the
dry-run, get an explicit "yes", then re-run with `--confirm` appended.
```sh
# Create — dry-run, then confirm
python3 "$NOTES" create --title "Groceries" --body "milk\neggs" # preview
python3 "$NOTES" create --title "Groceries" --body "milk\neggs" --confirm # writes
# Create in a folder, body from a file
python3 "$NOTES" create --title "Spec" --body-file draft.md --folder "Work" --confirm
# Append to an existing note
python3 "$NOTES" append "x-coredata://…/p42" --body "one more line" --confirm
# Move / organize
python3 "$NOTES" new-folder "Archive" --confirm
python3 "$NOTES" move "x-coredata://…/p42" --folder "Archive" --confirm
# Delete → goes to Recently Deleted (recoverable ~30 days)
python3 "$NOTES" delete "x-coredata://…/p42" --confirm
```
Content is treated as **plain text** (each line becomes a paragraph; the
`--title` is the note's first line, which Notes shows as the title). HTML in the
input is escaped, so it can't inject markup. Use `\n` for line breaks in
`--body`, or pass a file with `--body-file`.
## Gotchas
- **This is the user's real Notes account.** Confirm before any write.
- **`list` scans the whole library** — for large accounts it can take a few
seconds. Narrow with `--folder`, and cap with `--limit` (default 50). `search`
filters inside Notes and is faster.
- **Attachments / images:** notes containing images or attachments can be read
and exported as text, but `append` may not preserve embedded attachments —
avoid editing attachment notes here; open them in Notes instead.
- **Export → Markdown** converts common Notes formatting (headings, bold/italic,
lists, links, line breaks). Rich objects (tables, drawings, scanned docs)
degrade to plain text.
- **`move` stays within one account** (e.g. iCloud). Cross-account moves fail.
- **Never assume a `NOTE_ID`** — ids are store-specific; always get them from
`list` / `search` first.
- On a persistent authorization error, the Automation permission is missing —
tell the user to grant it (see Requirements) and stop; do not retry in a loop.From AceDataCloud/Skills, Apache-2.0.
More from AceDataCloud/Skills
- 0.646score
discord
acedatacloud
Work with the user's Discord account.
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
acedatacloud
acedatacloud
Manage your AceDataCloud account through the management API (platform.acedata.cloud).
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
bluesky
acedatacloud
Publish (with optional images), delete and read your own posts on Bluesky via the AT Protocol (XRPC).
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
didi-ride
acedatacloud
通过滴滴出行 MCP 打车、查价、查询订单、取消订单、规划路线(驾车/公交/步行/骑行)和搜索地点。Use when the user mentions 滴滴, 打车, 叫车, 回家/上班要打车, 查一下从 A 到 B 多少钱/怎么走, 查询订单, 司机在哪/多久到, 预约叫车, 路线规划, DiDi…
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
ghost
acedatacloud
Create drafts and publish or update posts on a self-hosted Ghost site through the official Admin API.
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
bilibili
acedatacloud
Read and publish 专栏 articles on Bilibili (bilibili.com) with the user's own login cookies (BYOC) — list their published articles with view/like/comment stats…
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
capability-spotlight-video
acedatacloud
Plan and submit a recurring series of diverse, premium Ace Data Cloud sales films.
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
cnblogs
acedatacloud
Publish, update and read CNBlogs (博客园) posts with a personal access token through the API used by the official vscode-cnb client.
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
csdn
acedatacloud
Read and publish on CSDN (blog.csdn.net) with the user's own login cookies (BYOC) — list their published articles with view/like/comment stats, inspect one…
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
cto51
acedatacloud
Read the connected 51CTO 博客 (blog.51cto.com) account and create Markdown article drafts with the user's own login cookies (BYOC).
SkillAFreshness: A★ 17Claude Code +9 - 0.643score
discordbot
acedatacloud
List channels, read recent messages, send channel messages, and send a single user-initiated DM on Discord using the user's own bot via the Discord REST API.
SkillAFreshness: A★ 17Claude Code +9 - 0.641score
happyhorse
AceDataCloud
Use HappyHorse video tools through an Ace Data Cloud account in Claude Code, including setup and retrieval of the same task.
SkillAFreshness: A★ 17Claude Code +9
Signals
- Stars
- 17
- Forks
- 1
- Open issues
- 0
- Last commit (this folder)
- Jul 3, 2026 (3 months ago)
- Last release
- Oct 23, 2026 (4 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Version
- 1.0
- License
- Apache-2.0
- Repository
- github.com/AceDataCloud/Skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from acedatacloud
- 0.646score
acedatacloud
acedatacloud
Manage your AceDataCloud account through the management API (platform.acedata.cloud).
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
bluesky
acedatacloud
Publish (with optional images), delete and read your own posts on Bluesky via the AT Protocol (XRPC).
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
cnblogs
acedatacloud
Publish, update and read CNBlogs (博客园) posts with a personal access token through the API used by the official vscode-cnb client.
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
bilibili
acedatacloud
Read and publish 专栏 articles on Bilibili (bilibili.com) with the user's own login cookies (BYOC) — list their published articles with view/like/comment stats…
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
capability-spotlight-video
acedatacloud
Plan and submit a recurring series of diverse, premium Ace Data Cloud sales films.
SkillAFreshness: A★ 17Claude Code +9 - 0.646score
csdn
acedatacloud
Read and publish on CSDN (blog.csdn.net) with the user's own login cookies (BYOC) — list their published articles with view/like/comment stats, inspect one…
SkillAFreshness: A★ 17Claude Code +9
Cite this page
apple-notes skill. Agent Mart. https://agentmart.dev/skills/acedatacloud-apple-notes (last updated 2026-10-24)