A lightweight, single-binary MCP server that gives Claude full read/write access to your Apple Notes. Built in Rust for instant startup and zero runtime overhead.
Talks to the Notes app via JXA
through Apple's osascript.
- macOS (Apple Notes is macOS-only)
- An MCP-compatible client (Claude Code, Claude Desktop)
Download the latest release for your macOS version, extract, and place in ~/.local/bin/:
mkdir -p ~/.local/bin
tar -xzf apple-notes-mcp-*.tar.gz -C ~/.local/bin/
chmod +x ~/.local/bin/apple-notes-mcpThen reference in your MCP config as ~/.local/bin/apple-notes-mcp.
For Claude Desktop with persistent TCC grants (optional):
~/.local/bin/apple-notes-mcp # Download scripts/sign.sh separately and run:
./scripts/sign.sh ~/.local/bin/apple-notes-mcpRequires a self-signed Code Signing certificate (see "Signing for Claude Desktop" below).
Requires Rust (rustup update).
cargo build --release
# binary at: target/release/apple-notes-mcpFor Claude Desktop, optionally sign after building:
./scripts/sign.sh{
"mcpServers": {
"apple-notes": {
"command": "~/.local/bin/apple-notes-mcp"
}
}
}{
"mcpServers": {
"apple-notes": {
"command": "~/.local/bin/apple-notes-mcp"
}
}
}On first use, macOS will prompt to allow the binary to control Notes. Approve it.
If you are blocked and prompted to trash apple-notes-mcp:
- click "done".
- Open System Preferences -> Privacy & Security.
- You should see
apple-notes-mcpnear the bottom. Click "Allow Anyway". - Restart Claude
| Tool | Description |
|---|---|
list_folders |
List all folders across all accounts |
list_notes |
List notes, optional folder filter and limit (default 50) |
get_note |
Full content of a note by name |
get_note_by_id |
Full content of a note by id |
create_note |
Create a note (title, body HTML, optional folder) |
search_notes |
Keyword search in title/body (query), up to 25 matches |
update_note |
Replace a note's body by name |
delete_note |
Delete a note by name (moves to Recently Deleted) |
This server controls Notes by sending Apple Events (via osascript). macOS gates
that behind permissions tied to whichever process it holds responsible for the
event — usually the app that launches the server, but under Claude Desktop it's
this binary itself (see "Which controlling app to use" below).
You may need to grant the controlling app:
- Automation → Notes — System Settings → Privacy & Security → Automation → find the controlling app → enable Notes.
After granting, restart the controlling app.
| Error | Meaning | Fix |
|---|---|---|
Not authorized to send Apple events to Notes. (-1743) |
Permission was denied/never granted, and the app can prompt | Grant Automation → Notes to the controlling app; see above |
Application isn't running. (-600) / AppleEvent timed out (-1712) |
The responsible process isn't a recognizable Apple Events client, so the event is dropped before any prompt, or Notes isn't open | Make sure Notes is open; under Claude Desktop, code-sign the binary (see "Signing for Claude Desktop") |
If you were never prompted and keep getting -1743, there's a stored "deny".
Re-trigger the prompt by resetting that app's Apple Events decisions, e.g.:
tccutil reset AppleEvents com.googlecode.iterm2 # iTerm2; use your app's bundle idmacOS attaches the grant to whichever process it holds responsible for the Apple Event, which differs by host:
- Claude Code in a terminal (iTerm2 / Terminal): ✅ the terminal is the responsible app — grant it Automation → Notes and every tool call works.
- Claude Desktop: ✅ supported, with a one-time signing step. Desktop launches
the server through a helper that disclaims responsibility, so the binary
becomes self-responsible — the grant then attaches to
apple-notes-mcpitself. For macOS to treat it as a promptable Apple Events client it needs an embeddedInfo.plist(it has one) and a code signature — see below.
cargo build --release
# binary at: target/release/apple-notes-mcpcargo test # unit tests (escape_html, script builders, parsing, result helpers)
# osascript tests require macOSThe binary embeds an Info.plist (bundle id + Apple Events usage string) so TCC
will show a "control Notes" prompt naming Apple Notes MCP. You just need to sign
it; using a stable self-signed certificate makes the granted permission persist
across rebuilds (TCC keys the grant to the certificate, not the per-build hash).
- One-time — create a self-signed Code Signing certificate. Keychain Access →
Certificate Assistant → Create a Certificate… → name it
Apple Notes MCP Signing, Identity Type Self-Signed Root, Certificate Type Code Signing. - Build and sign:
cargo build --release ./scripts/sign.sh # uses cert "Apple Notes MCP Signing" # or: SIGN_IDENTITY="Your Cert Name" ./scripts/sign.sh
- Approve the prompt. Restart Claude Desktop and run any Notes tool → macOS
shows "Apple Notes MCP" wants to control "Notes" → click OK. If a stale
denial blocks the prompt:
tccutil reset AppleEvents com.dpidan.apple-notes-mcpfirst, then retry.